簡體   English   中英

正向聲明的類型和“已經聲明為類類型的非類類型”

[英]Forward-declared type and “non-class type as already been declared as a class type”

我有以下代碼的問題:

  template <typename T>
  void foo(struct bar & b);
  struct bar {};
  int main(){}

它在GCC上成功編譯,但在MSVC(2008)上失敗並出現以下錯誤:

C2990: 'bar' : non-class type as already been declared as a class type

代碼是錯誤的還是MSVC中的錯誤?

如果我添加struct bar;它可以工作struct bar; 在模板定義之前。

在大多數情況下,C(或C ++編譯器)在源代碼上嚴格按照從上到下的方式工作。 因此,在嘗試引用struct bar之前需要一個前向聲明 ,否則編譯器將不知道它存在。

我們有贏家:

https://connect.microsoft.com/VisualStudio/feedback/details/668430/forward-declared-type-and-non-class-type-as-already-been-declared-as-a-class-type

感謝您報告此問題。 這確實是VC ++中不符合行為的情況。 但是,一個簡單的解決方法是重新排序聲明,以便在遇到模板聲明時知道聲明“struct bar”。 由於此錯誤的嚴重性較低以及我們的優先級,我們很遺憾我們無法在下一版本的編譯器中修復該錯誤,但我們會考慮將其用於將來的版本。

問候,

Tanveer Gani Visual C ++團隊

你很可能有struct bar {}; 在這個代碼塊之上的某個地方(可能在頭文件中)。 請參閱http://msdn.microsoft.com/en-us/library/zfcw8kk9.aspx

編輯:同樣來自上面的鏈接:

C2990也可能由於Visual C ++ 2005的Visual C ++編譯器發生重大變化而發生; 編譯器現在要求相同類型的多個聲明在模板規范方面是相同的。

由於foo是模板化的,並且barfoo參數列表中被“前向聲明”,因此如果移動struct bar {};會發生什么struct bar {}; 以上foo

這看起來像有效的代碼。 無論MSVC做什么,從我所看到的,它似乎是一些奇怪的不合規行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM