以下代码段适用于我:
class Foo {
public:
template <class T> T& get () { ... }
};
Foo foo;
foo.get<int>() = ...;
但是,以下代码段对我不起作用:
class Foo {
public:
template <class T> T& operator() () { ... }
};
Foo foo;
foo<int>() = ...;
错误是:
expected primary-expression before '>' token
expected primary expression before ')' token
这两个错误都是指foo<int>()
为什么这不起作用,是否可以解决这个问题?
答案 0 :(得分:10)
如果需要显式指定模板参数,则需要使用operator
语法:
foo.operator()<int>()
没有任何方法可以使用函数调用语法指定参数。如果你不能从函数的参数中推导出模板参数,那么最好使用成员函数而不是运算符重载。
答案 1 :(得分:1)
问题是您的模板参数列表位于错误的位置;就像你试图使用名为foo
的对象或函数一样使用模板参数int
,但实际上它是你想要模板参数列表的operator()
。
不幸的是(至少可以这么说),运营商无法解决这个问题。您必须将它们称为完整功能:
class Foo {
public:
template <class T> T& operator()() { ... }
};
Foo foo;
foo.operator()<int> = ...;
希望这有帮助。
答案 2 :(得分:-1)
或者你可以这样做
class Foo {
public:
template <class T> operator T&() { ... }
};
然后它将根据“返回”类型自动调用正确的函数:
Foo foo;
int i=foo;
我知道大多数人都不喜欢这个,因为被调用的函数取决于返回类型,但我发现它是一个很好的“技巧”,通常会清除语法。