Я подозреваю, что в приведенном ниже коде вызов временного объекта функции как с аргументом конструктора, так и с аргументом оператора вызова функции является каким-то двусмысленным из-за проблемы с наиболее неприятным синтаксическим анализом.
#include <iostream>
class Fun
{
public:
explicit Fun(int i): v_(i) {}
void operator()(int j) const
{
std::cout << (v_ + j) << "\n";
}
private:
int v_;
};
int main()
{
int a = 1;
int b = 2;
Fun(a)(b); // ERROR: conflicting declaration 'Fun a'
(Fun(a))(b); // OK: prints 3
return 0;
}
Выход на Ideone.
Добавление скобок, таких как (Fun(a))(b)
решает проблему, но я не совсем понимаю, как Fun(a)(b)
может быть проанализирован как объявление Fun a
,
к несчастью Fun(a)(b);
может быть проанализирован как Fun a(b);
которая является декларацией, а не временным объектом.
Увидеть Самый неприятный разбор
Простой пример, чтобы понять синтаксис объявления функции:
#include <iostream>
void (foo)(int a) {
std::cout << a << std::endl;
}
int main() {
foo(5);
}
Так что в вашем случае вы должны использовать это:
Fun(a).operator()(b);
(Fun(a))(b);