我想將自己的lib從Visual Studio移植到GNU/Linux上的g ++,並且我遇到了一些模板編譯問題。事實上,在Visual C++中,只有在代碼中明確使用模板時,纔會生成模板,但似乎(從我的錯誤中)g ++會在模板首次使用之前對其內容進行評估。這將導致以下錯誤:如何讓g ++模仿MSVC++的模板實例化行爲?
error: incomplete type ‘X’ used in nested name specifier
...因爲我包含模板代碼後,一些類,而不是之前。由於交叉使用衝突,我正在這樣做。
綜上所述,似乎Visual C++不會嘗試解析模板的使用內容,並且g ++會盡快解析。
class MyClass;
template<class _Ty>
void func(MyClass* a_pArg)
{
a_pArg->foo();
};
(不使用_Ty但沒關係,這只是問題的解釋)
在這種情況下的Visual C++編譯會(即使MyClass
沒有預先聲明)而g ++不會,因爲MyClass
尚未完全聲明。
有沒有辦法告訴g ++只在使用時實例化模板?
只是要清楚;你是說你*聲明* MyClass,然後定義函數模板,然後定義* MyClass *,然後最終實例化模板? –
@Juicebox:唷!在這個問題上做了一些手術。如果我破壞了任何東西,請告訴我。 :) –
@Juicebox:請注意,使用以下劃線開頭的名稱(例如'_Ty')是一個壞主意,因爲它們在很多情況下都是爲實現而保留的。 –