最近在编译一个程序时出现了一个很奇葩的编译错误,错误代码为C2143,错误说明为“语法错误: 缺少“;”(在“<end Parse>”的前面)”。看到这个错误我就卧槽了,<end Parse>是什么鬼?编译器提示错误位置在第2054行,而对应源文件的总行数只有2053行,这个2054行是从哪冒出来的?一开始我以为是文件中有特殊字符,把大量代码删除之后却编译成功,于是我怀疑是代码问题。我使用注释大法逐一进行编译测试,发现问题所在:
问题代码长得像这样子,在visual studio 2015下出现编译错误:
template<typename t> class C {
public:
C(int) {}
static C c;
};
template<typename t> C<t> C<t>::c{1};
int main() {
C<int>::c;//C2143
}
要再现这个错误需要具备2个条件:
- 模板类的静态成员变量使用花括号初始化
- 实例化模板
解决问题的方法很简单,把初始化改用圆括号即可。
template<typename t> const C<t> C<t>::c(1);