类模板的静态数据成员

时间:2010-08-16 07:07:06

标签: c++ templates

"A definition for a static data member may be provided in a namespace scope
 enclosing the definition of the static member's class template."

这意味着......

这是正确的.....

namespace N{
template<typename T>class A{
public: 
   static int x;
   static int fun();
 };

}
namespace N1{
template<class T>int A<T>::x=10; }
namespace N2{template<class T>int A<T>::fun(){return 10;} }
int main(){  return 0; }

根据声明......我的节目是否正确......

否则......任何一个人都会发表这个声明......有一个程序.... IT是ISO标准c ++的要点。第14.5.1.3章,第1点

2 个答案:

答案 0 :(得分:8)

如果您检查标准,您应该看到示例。

  

静态数据成员的定义可以在包含静态成员的类模板定义的命名空间范围中提供。 [示例:

template<class T> class X {
    static T s;
};
template<class T> T X<T>::s = 0;
     

- 示例]

您的计划不正确,因为

template<class T> A<int>::x=10;
template<class T> A<int>::fun(){return 10;}

没有使用模板参数T(你的意思是Ex而不是A?)。由于您正在专门化模板,因此您应该编写

template<> int Ex<int>::x = 10;
template<> int Ex<int>::fun() { return 10; }
命名空间N内的

(不在N1或N2等其他命名空间内。必须在声明Ex的同一命名空间中定义。)

答案 1 :(得分:0)

在您的示例中,您不指定静态定义的命名空间,因为在静态语句之前将其关闭。

此外,您不会为fun()的定义提供返回类型。

这应该更好:

namespace N{
template<typename T>class Ex{
public: 
    static int x;
    static int fun();
}

}
template<class T> N::Ex<T>::x=static_cast<T>(0);
template<class T> T N::Ex<T>::fun(){return static_cast<T>(10);}
int main(){  return 0; }

假设您的模板参数T在某种程度上是数字的。

<强>更新

纠正代码中的一些内容,这个用g ++编译:

namespace N{
    template<class T> class Ex{
    public:
        static T x;
        static T fun();
    };
}
template<class T> T N::Ex<T>::x=static_cast<T>(0);
template<class T> T N::Ex<T>::fun(){return static_cast<T>(10);}
int main(){  return 0; }