Pet*_*ham 5 c++ templates operator-overloading
我正在尝试使用函数编写可扩展的语法,但似乎无法找到接受模板函数的正确语法.我正在使用Visual C++ 2008.它将接受与模板函数相同类型的变量,或类似的非模板函数,但不接受模板函数本身.
错误1错误C2679:二进制'<<':找不到哪个运算符采用'重载函数'类型的右手操作数(或者没有可接受的转换)(行
***)
class Grammar {
friend Grammar operator << ( const Grammar& lhs, const char* rhs ) {
return lhs; // append rhs to grammar
}
template<typename T>
friend Grammar operator << ( const Grammar& lhs, T (*rhs) () ) {
return lhs; // append rhs() to grammar
}
};
template<typename T>
class ExpressionParticle {
};
template<typename T>
ExpressionParticle<T> Expression () ;
ExpressionParticle<int> ExpressionInt ();
int _tmain ( int argc, _TCHAR *argv[] )
{
ExpressionParticle<int> (*p)();
p = Expression<int>;
Grammar() << "p";
Grammar() << p;
Grammar() << ExpressionInt;
Grammar() << Expression<int>; // ***
Run Code Online (Sandbox Code Playgroud)
是什么类型Expression<int>,如果它是不是在上述p的类型?它的类型如何与类型不同ExpressionInt.
你的代码对我来说看起来不错,g++ 也很好。这似乎是 Visual Studio 中奇怪的重载解析错误。VS2005好像也有同样的问题。一个可能的解决方法是(用VS2005测试):
template<class T>
T id(T t) {return t; }
int main ()
{
ExpressionParticle<int> (*p)();
p = Expression<int>;
Grammar() << "p";
Grammar() << p;
Grammar() << ExpressionInt;
Grammar() << id(Expression<int>); // ***
}
Run Code Online (Sandbox Code Playgroud)