编译器无法推导出非成员运算符+的模板参数

时间:2014-06-08 01:20:41

标签: c++

我有以下代码:

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

template<typename T>
class A<T>::B{
public:
template<typename Y>
friend typename A<Y>::B operator+(typename A<Y>::B& b,int num){
    return b;
}
};


int main(){
A<int>::B a;
A<int>::B b = operator+(a,1);    // gives an error: "no matching function for call to
                                //'operator+(A<int>::B&, int)'
A<int>::B b = operator+<int>(a,1); // works
return 0;
}

如标题和评论中所述;为什么编译器不能推导出模板参数?这很重要,因为我不知道测试它的人会如何使用它。

顺便说一句,如果我把它定义为成员函数它可以工作,但我仍然想知道它为什么没有这种方式。另外,如果我定义operator+(int,A<int>::B)它会给出相同的错误(显然不能成为成员函数)。

1 个答案:

答案 0 :(得分:3)

问题与运算符等无关:您无法从嵌套类型中为定义嵌套类型的类推导出模板参数。微不足道的原因是没有任何东西强制嵌套类型只在一个实例中嵌套。但是,您可以调用操作符显式指定不可导出的模板参数。