我有以下代码:
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)
它会给出相同的错误(显然不能成为成员函数)。
答案 0 :(得分:3)
问题与运算符等无关:您无法从嵌套类型中为定义嵌套类型的类推导出模板参数。微不足道的原因是没有任何东西强制嵌套类型只在一个实例中嵌套。但是,您可以调用操作符显式指定不可导出的模板参数。