1

ファイル 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;
}

基本的に、 static const member を持つテンプレート化されたクラスがあります(NULLPOSITION)。クラス定義の外側とインラインの両方で、クラスの初期化を試みました

static const heapPosition NULLPOSITION=-1;

メンバーを宣言するとき。

ただし、どちらの場合も、SomeMethodその値を参照すると、ランダムな値になります。つまり、初期化されていません。

私はこの種のことを何度も行ってきましたが、この種の問題は一度もありませんでした。

私は何を間違っていますか?

誰か助けてくれませんか?どうぞよろしくお願いいたします。

ありがとう、ジェラルド・セレンテ

4

3 に答える 3

2

ランダムな値でよろしいですか?NULLPOSITIONasを宣言しunsignedたので、それを割り当てると(オーバーロードで呼び出されて) 大きな値が出力されます ( -1for 32bit )cout.operator<<unsigned4294967295int

于 2013-05-05T23:46:28.950 に答える
2

必要なもの:

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;

そうすれば、変数を定義せずに完全に回避できます (odr で使用されない限り)。

于 2013-05-05T23:32:48.877 に答える