在构造函数参数列表中构造boost::function对象时出现错误C2228 下面的代码在Visual C++ 2005中没有编译。 class SomeClass { public: boost::function<void()> func; SomeClass(boost::function<void()> &func): func(func) { } }; void someFunc() { std::cout << "someFunc" << std::endl; } int main() { SomeClass sc(boost::function<void()>(&someFunc)); sc.func(); // error C2228: left of '.func' must have class/struct/union return 0; } class-SomeClass{ public:boost::function func; SomeClass(boost::function&func):func(func){} }; void someFunc(){ std::cout
这被称为“C++最烦人的解析”(from)在构造函数参数列表中构造boost::function对象时出现错误C2228 下面的代码在Visual C++ 2005中没有编译。 class SomeClass { public: boost::function<void()> func; SomeClass(boost::function<void()> &func): func(func) { } }; void someFunc() { std::cout << "someFunc" << std::endl; } int main() { SomeClass sc(boost::function<void()>(&someFunc)); sc.func(); // error C2228: left of '.func' must have class/struct/union return 0; } class-SomeClass{ public:boost::function func; SomeClass(boost::function&func):func(func){} }; void someFunc(){ std::cout,c++,visual-c++,templates,argument-passing,boost-function,C++,Visual C++,Templates,Argument Passing,Boost Function,这被称为“C++最烦人的解析”(from) 同样,编译器更喜欢将有问题的行解释为函数声明。这是一个函数声明,用于引用一个boost:function并返回一个SomeClass。您可以记住以下规则,该规则适用于许多其他消除歧义的情况。您可以找到在C++标准的 8.2版/代码>中描述这些情况。 任何可能是声明的构造都将被视为声明 这意味着,以下内容将被视为参数声明,并带有多余的括号 boost::function<void()>(&someFunc) boost::funct
同样,编译器更喜欢将有问题的行解释为函数声明。这是一个函数声明,用于引用一个
boost:function
并返回一个SomeClass
。您可以记住以下规则,该规则适用于许多其他消除歧义的情况。您可以找到在C++标准的<代码> 8.2版/代码>中描述这些情况。
任何可能是声明的构造都将被视为声明
这意味着,以下内容将被视为参数声明,并带有多余的括号
boost::function<void()>(&someFunc)
boost::function<void()>(&someFunc)
boost::function<void()> &someFunc
SomeClass sc(boost::function<void()> &someFunc);
SomeClass sc((boost::function<void()>)&someFunc);
int (((((((a))))))) = 3;
int (*(pa)) = &a;