我不确定这段代码是否不会编译。
我正在使用的示例代码:
#include <iostream>
using std::cout;
using std::endl;
class Foo {
public:
template<typename T>
Foo& operator<<(const T& t) {
cout << t;
return *this;
}
};
int main() {
Foo foo;
foo << "Hello World"; // perfectly fine
foo << endl; // shit hits the fan
return 0;
}
这是错误:
test.cpp:19:12: error: no match for ‘operator<<’ in ‘foo << std::endl’
test.cpp:19:12: note: candidates are:
test.cpp:10:14: note: template<class T> Foo& Foo::operator<<(const T&)
test.cpp:10:14: note: template argument deduction/substitution failed:
test.cpp:19:12: note: couldn't deduce template parameter ‘T’
我很困惑为什么它不能用endl
( ostream& (*)(ostream&)
)的函数类型代替T
,当你指定时它显然可以这样做cout << endl;
我发现这解决了问题也令人费解[已编辑]
Foo& operator<<(ostream& (*f)(ostream&)) {
cout << f;
return *this;
}
如果问题不清楚,我问为什么它不能首先推断出模板。