C++类内初始化类模板实例成员报编译错误如何解决
错误原因
这是C++经典的「最令人头疼的解析」语法问题:类内声明成员时使用括号语法初始化,编译器会优先将其解析为成员函数声明而非对象初始化。你写的Foo<int> AFoo(3);会被编译器尝试解读为:返回值为Foo<int>、名为AFoo、参数类型为3的成员函数,数字3显然不能作为参数类型,因此抛出「expected identifier before numeric constant」报错。
修复方案
有两种通用修复方式:
方案1:使用花括号初始化(C++11及以上版本支持)
直接将类内初始化的括号替换为花括号,即可避免被解析为函数声明,修改后的Bar类代码如下:
class Bar { private: Foo<int> AFoo{3}; // 把()替换为{} public: Bar(){} };
方案2:在构造函数初始化列表中初始化成员
如果编译环境不支持C++11,或者习惯用初始化列表做成员初始化,可以把初始化逻辑移到Bar的构造函数中,类内仅做成员声明:
class Bar { private: Foo<int> AFoo; // 仅声明不初始化 public: Bar() : AFoo(3) {} // 初始化列表中调用Foo的构造函数 };
两种方案均可解决编译报错问题,优先推荐方案1,写法更简洁,也符合现代C++编码习惯。
内容的提问来源于stack exchange,提问作者Rex Liu
相关产品推荐
相关产品推荐

