Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2015, 20:42   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию operator==

Добрый день, как правильно записать:
Код:
template <typename>
struct S
{
    struct SS{};
};

template <typename T>
bool operator==(const typename S<T>::SS &, const typename S<T>::SS &) {return true;}

int main()
{
    S<int>::SS t, y;
    if(t == y)
        cout << "sfsdf";

    return 0;
}
Т.е. необходим внешний operator==(S::SS, S::SS) (в разных модулях может быть свой оператор) для любого S. Сделать внутренний ==, вынести SS наружу - не вариант.
220Volt вне форума Ответить с цитированием
Старый 16.01.2015, 21:32   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Код:
template <>
bool operator ==<int> (const typename S<int>::SS& one, const typename S<int>::SS& two)
{
    return false;
}
Только странно все это...
waleri вне форума Ответить с цитированием
Старый 16.01.2015, 21:35   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Ну это понятно, как без явной специализации?
220Volt вне форума Ответить с цитированием
Старый 19.01.2015, 17:48   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
необходим внешний operator==(S::SS, S::SS) (в разных модулях может быть свой оператор) для любого S. Сделать внутренний ==, вынести SS наружу - не вариант.
Если ед. трансляций требуется собственная версия оператора, то самый простой и правильный способ - не выносить шаблоно-прототип в хэдэр, а объявить и определить его внутри этих ед. трансляций:

some.cpp
Код:
//безымянный спейс гарантирует, 
// что его содержимое будет недоступно для других ед. трансляций
namespace
{
    template <class T>
    bool operator==(const typename S<T>::SS &, 
                            const typename S<T>::SS &) 
    {return true;}
}
И так в каждой ед. трансляции, где это нужно. Можно спокойно впиливать свою собственную реализацию.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
operator char*() + operator[](uint) riden Общие вопросы C/C++ 3 17.02.2013 08:45
operator= _Bers Общие вопросы C/C++ 2 18.04.2012 06:45
operator== stenl1 Общие вопросы C/C++ 11 27.07.2011 06:38
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
Operator C++ EfiopianDIMON Общие вопросы C/C++ 1 13.12.2008 16:52