![](/img/trans.png)
[英]Partial template specialization using nested (undefined yet) type of a forward-declared class
[英]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
之前需要一個前向聲明 ,否則編譯器將不知道它存在。
我們有贏家:
感謝您報告此問題。 這確實是VC ++中不符合行為的情況。 但是,一個簡單的解決方法是重新排序聲明,以便在遇到模板聲明時知道聲明“struct bar”。 由於此錯誤的嚴重性較低以及我們的優先級,我們很遺憾我們無法在下一版本的編譯器中修復該錯誤,但我們會考慮將其用於將來的版本。
問候,
Tanveer Gani Visual C ++團隊
無論如何,我在Microsoft Connect中發布了一個錯誤: https : //connect.microsoft.com/VisualStudio/feedback/details/668430/forward-declared-type-and-non-class-type-as-already-been-聲明作為一種類型
你很可能有struct bar {};
在這個代碼塊之上的某個地方(可能在頭文件中)。 請參閱http://msdn.microsoft.com/en-us/library/zfcw8kk9.aspx
編輯:同樣來自上面的鏈接:
C2990也可能由於Visual C ++ 2005的Visual C ++編譯器發生重大變化而發生; 編譯器現在要求相同類型的多個聲明在模板規范方面是相同的。
由於foo
是模板化的,並且bar
在foo
參數列表中被“前向聲明”,因此如果移動struct bar {};
會發生什么struct bar {};
以上foo
?
這看起來像有效的代碼。 無論MSVC做什么,從我所看到的,它似乎是一些奇怪的不合規行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.