2016-09-01 48 views
1

我們正在從VS2005遷移到VS2015,同樣的代碼在VS 2005中編譯正常,但在VS 2015中引發錯誤 「' F':非法類型非類型模板參數‘F’」VS2015錯誤 - 'F':非類型模板參數'F'

#define DLLEXPORT __declspec (dllexport) 
template <class DLLEXPORT F> class DLLEXPORT QWCalloutManager { 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

任何幫助?

+0

mmm ...你在建立一個DLL或應用程序嗎?也許我錯了,但如果我的記憶服務,這兩種情況[需要區別對待](https://msdn.microsoft.com/en-us/library/8fskxacy.aspx)。 –

+0

它是一個試圖構建的靜態庫。但即使對於一個應用程序,我認爲我們得到相同的錯誤 –

回答

0

你需要重寫爲:

#define DLLEXPORT __declspec (dllexport) 
template <class F> class DLLEXPORT QWCalloutManager { 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

沒有辦法說F必須是一個導出類(除非你可以寫一個靜態斷言它)。你只需要在代碼審查中檢查它。

+0

這符合,但稍後,當這用於另一個項目,它會給鏈接器錯誤 –

+0

這是一個不同的問題。我們至少需要看看模板是如何實例化的,以及用於F的類的定義(當然還有鏈接器錯誤消息)。 –

0

也許VS 2005沒有投訴,但template <class __declspec (dllexport) F> class ...是無效的MSVC++語法。

嘗試從模板參數中刪除DLLEXPORT

#define DLLEXPORT __declspec (dllexport) 
template <class F> class DLLEXPORT QWCalloutManager { 
};