2009-12-30 207 views
6

我已經得到了這個代碼從Windows到Linux端口。模板類的靜態模板字段?

template<class T, int Size> 
class CVector { 
/* ... */ 
}; 

template<int n, int m> 
class CTestClass { 
public: 
enum { Size = 1 << n }; 
private: 
static CVector<int, Size> a; // main.cpp:19 
}; 

template<int n, int m> 
CVector<int, CTestClass<n, m>::Size> CTestClass<n, m>::a; // main.cpp:24 

它與VS2008編譯,但不與g ++ 4.3.2。 我收到的錯誤是:

main.cpp:24: error: conflicting declaration ‘CVector CTestClass::alpha_to’

main.cpp:19: error: ‘CTestClass< n, m >::alpha_to’ has a previous declaration as ‘CVector< int, CTestClass< n, m >::Size > CTestClass< n, m >::alpha_to’

main.cpp:24: error: declaration of ‘CVector< int, CTestClass< n, m >::Size > CTestClass< n, m >::alpha_to’ outside of class is not definition

是否有人知道如何讓它編譯通過G ++?

謝謝!

+1

,我認爲它的另一個MSVC++的擴展,雖然我不知道。有人請點亮它。 – 2009-12-30 15:38:01

回答

8

這個工程用gcc 3.4 & 4.3以及VC8:

template<class T, int Size> 
class CVector { 
/* ... */ 
}; 

template<int n, int m> 
class CTestClass { 
public: 
    enum { Size = 1 << n }; 
    typedef CVector<int, Size> Vector; 
private: 
    static Vector a; 
}; 

template<int n, int m> 
typename CTestClass<n,m>::Vector CTestClass<n,m>::a; 
+0

似乎是解決問題。 非常感謝! – Alex 2009-12-30 16:08:19

-1

如果你在課堂外面拿出a的聲明,它會用g ++ v。3.4.4編譯cygwin。

順便說一句,爲什麼不使用std::vector而不是CVector

+0

不,我不明白爲什麼他甚至不需要初始化靜態成員。你能解釋一下嗎? – 2009-12-30 15:19:30

+0

他沒有初始化它,因爲他沒有給它任何價值。他只是在宣佈它。 – Dima 2009-12-30 15:30:33

+0

其實CTestClass :: a確實取決於模板參數'n'。仔細看代碼。 爲什麼不使用std :: vector而不是CVector? 這不是我的代碼,但假設有一些原因。實際上它並不重要 - 代碼也不會用std :: vector編譯。 – Alex 2009-12-30 15:33:20

0

其實CTestClass :: a確實取決於模板參數'n'。仔細看代碼。

why not use std::vector instead of CVector?

這不是我的代碼,但假設有一些原因。事實上它並不重要 - 代碼也不會與std::vector一起編譯。

+0

你說得對。對不起,我錯過了。但是請嘗試刪除第24行的聲明。我剛剛嘗試過,並且它在cygwin上用g ++編譯。 – Dima 2009-12-30 15:32:59

+0

而且這個代碼的功能會保存在這種情況下嗎? – Alex 2009-12-30 15:39:00

+1

是啊,在編譯時不會有任何問題(如果他刪除該行),但他的程序不會鏈接。 – 2009-12-30 15:46:00

-1

在CTestClass中,Size是一個枚舉而不是一個int(通過標準它依賴於實現,enum不一定是一個整數)。嘗試使用一個靜態常量int大小= ...

+0

不起作用。 也有同樣的錯誤。 – Alex 2009-12-30 15:43:09