假設你的代碼「無效的模板參數」錯誤,但不是GCC
template <template<class> class BaseType>
class EST16
: public BaseType<int>
{
public:
EST16(double d)
{
}
};
template <class T>
class SCEST
{
T y;
};
typedef EST16<SCEST> EST16_SC;
class Child
: public EST16_SC
{
public:
Child()
: EST16_SC(1.0)
{
}
};
class NotWorkingChild
: public EST16<SCEST>
{
public:
NotWorkingChild()
: EST16<SCEST>(1.0)
{
}
};
TEST(TemplateTest, TestInstantiate)
{
Child child;
NotWorkingChild notWorkingChild;
}
兒童和NotWorkingChild只有typedef的不同。在GCC編譯兩種,在Visual Studio NotWorkingChild的構造產生以下錯誤:
2>..\..\..\src\itenav\test\SCKFErrorStateTest.cpp(43) : error C3200: 'SCEST<T>' : invalid template argument for template parameter 'BaseType', expected a class template
2> with
2> [
2> T=int
2> ]
你能解釋一下爲什麼是這樣的情況?有沒有比typedef更好的便攜式解決方案?
謝謝!
你有沒有寫過任何實際實例化和使用模板類的代碼?我的意思是說,「主」。可能發生的一件事情是,VCC在看到'typedef'時測試實例化,而GCC在實際使用其中一個子類之前不會感到煩惱。如果那是真的,那麼只要你真正編寫使用其中一個子類模板的代碼,你也會在GCC中得到錯誤。 – phooji 2011-03-15 17:09:13
是的,我做到了。 TEST宏創建一個實際從main()調用的Google測試。 – Philipp 2011-03-15 17:25:50
對不起 - 'TEST'宏是在我滾動截斷之後,所以我錯過了它。我不是100%爲什麼會失敗,但是我已經發布了一個替代方法,它應該在編譯器中更具可移植性。這也是更可讀,在我的愚蠢觀點:) – phooji 2011-03-15 17:39:16