2014-01-09 63 views
2

我有這樣的代碼:可以定義模板類內的嵌套模板類的非交換運算符嗎?

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

而且我想申報「==」操作上的一個<牛逼> :: 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 '。在比較運算符中,const引用更爲可取。 – 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中進行編譯時,必須在「A :: B &」之前的參數中添加「typename」以進行編譯。但是,當我在現場示例(用g ++編譯)中這樣做時,這給了我這個錯誤:'typename A :: B'name'template template class A :: B',which is not a類型。任何想法爲什麼這樣? –

+0

@PetrHudeček對於我來說,這看起來像VS中的一個bug,我很確定GCC(和Clang與GCC一致)在這裏是正確的。 –