2014-01-09 2 views
2

У меня есть этот код:Можно ли определить некоммутативный оператор для вложенного шаблонного класса внутри шаблонного класса?

template<typename T> 
class A 
{ 
    public: 
    template<typename innerT> 
    class B 
    { 
    }; 
}; 

И я хочу, чтобы объявить «==» оператора на <T> :: B <innerT> и «INT», так что она возвращает разные вещи, основанные на ли целое число приходит первым или вторым.

Метод тестирования будет выглядеть следующим образом:

#include <iostream> 
int main(int argc, char** argv) 
{ 
A<float>::B<double> b; 
std::cout << (b == 2) << " is different from " << (2 == b); 
} 

Я думал о чем-то вроде этого:

template<typename T, typename innerT> bool operator==(typename A<T>::B<innerT> & one, int two) 
{ return true; } 

template<typename T,typename innerT> bool operator==(int one, typename A<T>::B<innerT> & two) 
{ return false; } 

Но это не работает.

+0

Проблема здесь состоит в том, что 'T' является не выводится контекст. – jrok

+1

Даже если замечание @jrok не справедливо, следует использовать конструкцию с ключевым словом 'template' в следующем контексте:' typename A :: template B '. И константная ссылка предпочтительнее в операторах сравнения. – Constructor

ответ

2

Вы можете переместить их в класс A как друзья:

template<typename T> 
class A 
{ 
public: 
    template<typename innerT> 
    class B 
    { 
    }; 

    template<typename innerT> 
    friend bool operator==(A::B<innerT> & one, int two) 
    { return true; } 

    template<typename innerT> 
    friend bool operator==(int one, A::B<innerT> & two) 
    { return false; } 
}; 

Live example

+0

Спасибо. Кажется, это работает. Однако в Visual Studio для его компиляции я должен добавить «typename» перед «A :: B &» в параметрах для его компиляции. Но когда я делаю это в живом примере (скомпилированном под g ++), это дает мне эту ошибку: 'typename A :: B' template ' template class A :: B', который не является тип. Любая идея, почему это так? –

+0

@ PetrHudeček Это похоже на ошибку в VS для меня, я уверен, что GCC (и Clang, который согласен с GCC на этом), верны здесь. –

Смежные вопросы