2016-09-24 84 views
0

我有以下類 - Matrix<T> 類代表T類型的對象的矩陣,它的超類baseMAtrix保存一個靜態布爾變量parallel_於所有類型的Matrix<T>C++模板類變化的靜態成員的值

我要訪問parallel_但似乎我的代碼不鏈接 -

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; 
    } 
}; 

我得到這個消息 -

`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文件是我叫setParallel -

Matrix<int>::setParallel(true);

這是撥打setParallel的正確方法嗎?

這是訪問baseMatrix::_parallel的正確方法嗎?

+0

技術上你只需要定義變量。 'bool baseMatrix :: _ parallel;'在某個地方的全局範圍內。順便說一句,你可以通過避免全局變量(這是)避免了額外的工作,並且通過使用單個約定來對類型名稱進行大寫。 –

+0

@ Cheersandhth.-Alf你是什麼意思?爲什麼MAtrix無法訪問其超類的成員? 我不能定義一個全局變量,因爲我不是要使用類 – 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> 
... 

這種方式存在cpp文件不需要baseMatrix::_parallel

+0

point baseMAtrix是爲了確保我可以將「parallel_」的值更改爲「Matrix 」的所有時刻,而不管「T」如何。 – proton

+0

@proton:從技術上講,如果你繼承了單一的專長,比如'baseMatrix ''。我冒昧編輯答案來做到這一點。對於模板類有一個特殊的豁免,即使標題在多個翻譯單元中使用,也會生成此有效的代碼(「_parallel」定義中沒有鏈接器衝突)。 –

+0

@ Cheersandhth.-Alf感謝編輯,解決了它:) – xinaiz