Ты в принципе прав. Допустимо определять шаблонные операторы, но их нельзя вызывать напрямую с явными аргументами шаблона.
Если у вас есть этот оператор:
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>()
функцию вместо использования оператора.