模板类中的静态const成员inizialitazion

时间:2013-05-05 23:29:31

标签: c++ class templates const

在文件SomeClass.h中

#ifndef SOME_CLASS_H_
#define SOME_CLASS_H_

#include <iostream>
using std::cout;
using std::endl;

template <class T, class P>
class SomeClass
{
      public:
            SomeClass();
            void SomeMethod();

      protected: 
              typedef unsigned int heapPosition;
              heapPosition someVariable;


      private:                
              static const heapPosition NULLPOSITION;
};

template <class T, class P>
const typename SomeClass<T,P>::heapPosition SomeClass<T,P>::NULLPOSITION = -1;

template <class T, class P>
SomeClass<T,P>::SomeClass(){}

template <class T, class P>
void SomeClass<T,P>::SomeMethod()
{
    someVariable=NULLPOSITION;
    cout<<"NULLPOSITION:"<<NULLPOSITION<<endl;
}

#endif

在文件main.cpp中

#include <cstdlib>
#include <iostream>

#include "SomeClass.h"
using namespace std;

int main(int argc, char *argv[])
{

    SomeClass<int,int> someClass;

    someClass.SomeMethod();

    system("PAUSE");
    return EXIT_SUCCESS;
}

基本上我有一个带有静态const成员(NULLPOSITION)的模板化类。 我尝试过类的定义和内联的inizialitazion 如在

static const heapPosition NULLPOSITION=-1;

宣布成员时。

然而,在这两种情况下,当我在SomeMethod中引用时,它的值是一些随机值 - 即它尚未初始化。

我很多次都做过这种事情,而且我从未遇到过这种类型的问题。

我做错了什么?

有人可以帮帮我吗?非常感谢你的时间。

谢谢, 杰拉德·塞伦特

3 个答案:

答案 0 :(得分:2)

问题是您要将NULLPOSITION声明为unsigned int并将其分配为-1

答案 1 :(得分:2)

你确定它是随机值吗?您已将NULLPOSITION声明为unsigned,因此将-1分配将导致cout.operator<<(在unsigned重载中调用)打印一些较大的值({{1对于32位4294967295

答案 2 :(得分:1)

你需要:

template <class T, class P>
const typename SomeClass<T, P>::heapPosition SomeClass<T, P>::NULLPOSITION = -1;

或者只是:

template <class T, class P>
const unsigned int SomeClass<T, P>::NULLPOSITION = -1;

(这需要进入头文件。)

但是,更好的方法是将初始化程序添加到类定义中:

private:
    static const heapPosition NULLPOSITION = -1;

这样你就可以在没有定义变量的情况下完全逃脱(只要它没有使用过多的东西。)