2016-09-24 8 views
0

私は以下のクラスがある - タイプTのオブジェクトのマトリックスを意味 クラスMatrix<T>を、そしてそれはMatrix<T>のすべてのタイプに共通の静的なブール変数parallel_を保持しているスーパークラスbaseMAtrixです。C++テンプレートクラスの変更静的メンバの値

私はparallel_にアクセスしたいが、私のコードではなく、リンクないようだ -

- 私は setParallelを呼ぶところ

`CMakeFiles/ex3.dir/Tester.cpp.o:Tester.cpp:(.rdata$.refptr._ZN10baseMatrix9_parallelE[.refptr._ZN10baseMatrix9_parallelE]+0x0): undefined reference to `baseMatrix::_parallel' 
collect2: error: ld returned 1 exit status` 

Tester.cppファイルがある - 私はこのメッセージを

class baseMatrix { 
protected: 
    static bool parallel_; 
}; 

template<class T> 
class Matrix : baseMatrix{ 

public: 
    static void setParallel (bool parallel){ 
     if(parallel != baseMAtrix::parallel_){ 
      cout << "message" << endl; 
     } 
     baseMAtrix::parallel_ = parallel; 
    } 
}; 

取得します

Matrix<int>::setParallel(true);

はこれをsetParallelと呼ぶ正しい方法ですか?

これは適切な方法ですbaseMatrix::_parallelにアクセスしますか?

+0

技術的には、変数を定義するだけです。 'bool baseMatrix :: _ parallel;'どこかのグローバルスコープで。ちなみに、グローバル変数(これはこれを避けてください)を避け、タイプ名の大文字小文字を区別するための単一の規約を使用することで、余計な作業を避けることができます。 –

+0

@ Cheersandhth.-Alfどういう意味ですか?なぜMAtrixはそのスーパークラスのメンバーにアクセスできないのですか? クラスを使用するためにonwがないためグローバル変数を定義できません – proton

+0

また、先頭にアンダースコアを付ける慣習の代わりに、末尾にアンダースコアを付けることを検討してください(例:Boostで使用)。先頭のアンダースコアは、さまざまなこと、つまり実装によって定義された名前のために使用される規約です。したがって、先頭のアンダースコアはグローバル名前空間に予約されています。 –

答えて

0

あなただけのヘッダに優しい滞在したい場合は、テンプレートに基本クラスを変更することができます:

template<class T> 
class baseMatrix 
{ 
protected: 
    static bool _parallel; 
}; 

template<class T> 
bool baseMatrix<T>::_parallel; 

template<class T> 
class Matrix : baseMatrix<void> 
... 

この方法baseMatrix::_parallelcpp内のファイルは必要ありません。

+0

ポイントbaseMAtrixは、 'parallel_'の値を' T 'に関係なく 'Matrix 'のすべての瞬間に変更できることを確認することです。 – proton

+0

@proton: 'baseMatrix 'のような単一の特殊化を継承するのは技術的には問題ありません。私はそれを行うために答えを編集する自由を取った。ヘッダーが複数の翻訳単位で使用されていても( '_parallel'の定義上のリンカーの競合がなくても)、この有効なコードを作るテンプレートクラスに対して特別な免除があります。 –

+0

@ Cheersandhth.-Alf編集のためのありがとう、それはそれを解決する:) – xinaiz

関連する問題