Din*_*esh 7 c++ templates operator-overloading
我尝试使用模板进行函数调用操作符重载,如下面的程序:
#include <stdio.h>
struct Apple
{
template <typename tn> tn value ();
template <typename tn> tn operator () ();
};
template <> int Apple::value ()
{
return 10;
}
template <> int Apple::operator () ()
{
return 10;
}
int main()
{
Apple apple;
printf("Value : %d\n", apple<int>());
printf("Value : %d\n", apple.value<int>());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当第二次打印中的值函数调用未显示任何错误时,第一次打印中的函数调用操作符显示expected primary-expression
错误.我不知道我做错了什么.任何人都可以提前帮助我知道这个问题.
vso*_*tco 11
问题是在调用模板化operator()
(第二行main()
)时.在您的情况下,您需要显式指定返回类型,因为它无法推断,并且正确的方法是:
printf("Value : %d\n", apple.operator()<int>());
Run Code Online (Sandbox Code Playgroud)
operator()()
是一个模板成员函数,它()
作为参数.所以,它的名字是operator()
,它的参数列表是()
.因此,要引用它,您需要使用apple.operator()
(其名称),然后使用<int>
(模板参数),然后使用()
(参数列表).更换精神上的名字operator()
与FUNCTION
,所以operator()()
就是FUNCTION()
,你会看到的模式.在您的情况下,apple<int>()
是operator()()
在模板实例化apple<int>
对象上调用非模板,即apple<int>.operator()()
,这不是您想要的.
有用的定义这样的运算符?可能不会,因为它导致丑陋的语法.
你可以通过auto
在C++ 14中使用返回类型来实现你可能想要的东西,比如
#include <stdio.h>
struct Apple
{
template <typename tn> tn value ();
auto operator () ();
};
template <> int Apple::value ()
{
return 10;
}
auto Apple::operator () () // not a template anymore, return type is deduced int
{
return 10;
}
int main()
{
Apple apple;
printf("Value : %d\n", apple());
printf("Value : %d\n", apple.value<int>());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,auto
并没有真正闪耀,因为你可以手动指定int
为返回类型,但在更复杂的声明中可能真的很有用.
归档时间: |
|
查看次数: |
2836 次 |
最近记录: |