Ответ 1
Вам нужно указать T
.
int i = c.operator()<int>();
К сожалению, вы не можете использовать синтаксис вызова функции непосредственно в этом случае.
Изменить: О, и вам не хватает public:
в начале определения класса.
В С++ у вас есть шаблонный оператор в классе? Например:
class MyClass {
public:
template<class T>
T operator()() { /* return some T */ };
}
Это похоже на компиляцию просто отлично, но путаница возникает в том, как ее можно использовать:
MyClass c;
int i = c<int>(); // This doesn't work
int i = (int)c(); // Neither does this*
Тот факт, что он вообще компилируется, подсказывает мне, что это выполнимо, я просто в недоумении, как его использовать! Любые предложения, или это метод использования не стартера?
Вам нужно указать T
.
int i = c.operator()<int>();
К сожалению, вы не можете использовать синтаксис вызова функции непосредственно в этом случае.
Изменить: О, и вам не хватает public:
в начале определения класса.
Ты в основном прав. Легально определять шаблонные операторы, но они не могут быть вызваны напрямую с явными аргументами шаблона.
Если у вас есть этот оператор:
template <typename T>
T operator()();
как в вашем примере, его можно вызвать только так:
int i = c.operator()<int>();
Конечно, если аргумент шаблона можно вывести из аргументов, вы все равно можете назвать его обычным способом:
template <typename T>
T operator()(T value);
c(42); // would call operator()<int>
Альтернативой может быть сделать аргумент ссылкой и сохранить там результат, а не возвращать его:
template <typename T>
void operator()(T& value);
Итак, вместо этого:
int r = c.operator()<int>();
вы могли бы сделать
int r;
c(r);
Или, возможно, вам нужно просто определить простую функцию get<T>()
вместо использования оператора.
Разве вы не думаете о
class Foo {
public:
template<typename T>
operator T() const { return T(42); }
};
Foo foo;
int i = (int) foo; // less evil: static_cast<int>(foo);
живой пример. Это доказывает, что вам не нужно указывать аргумент шаблона, несмотря на требование в принятом ответе.