Шаблоны функций-членов и оператор перегрузки () в C ++ - PullRequest
6 голосов
/ 03 января 2011

У меня работает следующий фрагмент кода:

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 ]

10 голосов
/ 03 января 2011

Если вам нужно явно указать аргумент шаблона, вам нужно будет использовать синтаксис operator:

foo.operator()<int>()

Нет никакого способа указать аргументы, используя синтаксис вызова функции.Если вы не можете вывести аргументы шаблона из аргументов функции, лучше использовать функцию-член, чем перегрузку оператора.

1 голос
/ 03 января 2011

Проблема в том, что ваш список параметров шаблона находится не в том месте;это как если бы вы пытались использовать объект или функцию с именем foo с аргументом шаблона int, но на самом деле это operator(), для которого вам нужен список параметров шаблона.

К сожалению (возможнотак, по крайней мере), с операторами это никак не обойти.Вы должны вызывать их как полные функции:

class Foo {
public:
    template <class T> T& operator()() { ... }
};

Foo foo;
foo.operator()<int> = ...;

Надеюсь, это поможет.

0 голосов
/ 03 января 2011

Или вы можете сделать это

class Foo {
public:
  template <class T> operator T&() { ... }
};

Затем он автоматически вызовет нужную функцию в зависимости от типа возврата:

Foo foo;
int i=foo;

Я знаю, что большинству людей это не нравится, поскольку вызываемая функция зависит от типа возвращаемого значения, но я считаю, что это отличный "прием", который часто очищает синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...