1. 程式人生 > >解決C2143語法錯誤: 缺少“;”(在“”的前面)

解決C2143語法錯誤: 缺少“;”(在“”的前面)

最近在編譯一個程式時出現了一個很奇葩的編譯錯誤,錯誤程式碼為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);