成员函数模板和C ++中的重载operator()

时间:2011-01-03 15:53:52

标签: c++ templates operator-overloading

以下代码段适用于我:

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>()

为什么这不起作用,是否可以解决这个问题?

3 个答案:

答案 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;

我知道大多数人都不喜欢这个,因为被调用的函数取决于返回类型,但我发现它是一个很好的“技巧”,通常会清除语法。