重载运算符<<接受模板函数
我试图能够使用函数编写可扩展语法,但似乎找不到接受模板函数的正确语法。我使用的是 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>; // ***
Expression
如果不是上面p的类型呢?它的类型与 ExpressionInt
的类型有何不同。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你的代码对我来说看起来不错,g++ 也很好。这似乎是 Visual Studio 中奇怪的重载解析错误。 VS2005好像也有同样的问题。一个可能的解决方法是(用VS2005测试):
Your code looks OK to me, and g++ is fine with that too. This seems to be weird overload resolution bug in Visual Studio. VS2005 seems to have the same problem. A possible workaround is (tested with VS2005):
将此:更改
为:
Change this:
to this:
作为另一种解决方法,我可以通过强制转换使其在 VS2010 上运行。为了方便起见,我使用了 typedef。 VS2008 可能也会有同样的效果。
As another work-around, I was able to get it to work on VS2010 by casting. I used the typedef for convenience. VS2008 probably will work the same.
MSVC 2013 仍然包含相同的错误,但至少现在如果您使用转换解决方案,您可以使用更新的 C++11 别名模板语法:
然后像这样进行转换:
MSVC 2013 still contains the same bug, but at least now you can use the newer C++11 alias template syntax if you go with the casting solution:
Then do the cast like this: