重载operator <<以接受模板函数

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.

Nor*_*ame 3

你的代码对我来说看起来不错,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)