模板类的静态模板字段?

时间:2009-12-30 15:09:37

标签: c++ templates

我已将此代码从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:错误:冲突   声明'CVector CTestClass :: alpha_to'

     

main.cpp:19:错误:'CTestClass&lt; N,   m&gt; :: alpha_to'有一个前一个   声明为'CVector&lt; INT,   CTestClass&LT; n,m&gt; ::尺寸&gt; CTestClass&LT; N,   m&gt; :: alpha_to'

     

main.cpp:24:错误:声明   “CVector&LT; int,CTestClass&lt; n,m&gt; ::尺寸&gt;   CTestClass&LT; n,m&gt; :: alpha_to'在...之外   class不是定义

有人知道如何通过g ++使其可编辑吗?

谢谢!

5 个答案:

答案 0 :(得分:8)

这适用于gcc 3.4&amp; 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;

答案 1 :(得分:0)

实际上CTestClass :: a取决于模板参数'n'。仔细查看代码。

  

为什么不使用std :: vector而不是CVector?

这不是我的代码,但假设有一些原因。事实上它并不重要 - 代码也不会用std::vector编译。

答案 2 :(得分:0)

答案 3 :(得分:-1)

如果你在课外取出a的声明,它会在gg v + 3.4.4上编译cygwin。

顺便说一下,为什么不使用std::vector代替CVector

答案 4 :(得分:-1)

在CTestClass中,Size是一个枚举而不是一个int(根据标准它的实现依赖,枚举不必是一个整数)。尝试使用静态const int Size = ...