我一直在尝试使用模板化适配器来启用重载运算符。我收到一个编译错误(gcc 4.5.2),这对我来说似乎很矛盾。我想知道为什么以及如何解决它。下面是说明问题的简化代码。
// The adapter
template <typename T>
class A {
T t;
public:
A(T t_) : t(t_) {}
};
// Utility function to return an adaptor
template <typename T>
A<T> make_A(T t) {
A<T> a(t);
return a;
}
// The operator overload on the adapter
template <typename T>
A<T> &operator<<(A<T> &a, int) {
return a;
}
// Shows use case
int main(int,char**) {
auto aa = make_A(1);
aa << 2; // Compiles
// Desired use:
make_A(4) << 5; // Compile Error
}
错误消息:
main_operatorinsert.cpp: In function ‘int main(int, char**)’:
main_operatorinsert.cpp:28:22: error: no match for ‘operator<<’ in ‘make_A [with T = int](4) << 5’
main_operatorinsert.cpp:18:11: note: candidate is: A<T>& operator<<(A<T>&, int) [with T = int]
为什么行“aa << 2;” 编译,其中行“make_A(4) << 5;” 才不是?make_A 返回与 aa 相同的类型。为什么编译器会出现不匹配?我怎样才能解决这个问题?