2015-12-16 214 views
0

我想寫一個模板類的拷貝構造函數。我有這個類:模板類拷貝構造函數

template<int C> 
class Word { 
    array<int, C> bitCells; //init with zeros 
    int size; 

public: 
    //constructor fill with zeros 
    Word<C>() { 
     //bitCells = new array<int,C>; 
     for (int i = 0; i < C; i++) { 
      bitCells[i] = 0; 
     } 
     size = C; 
    } 
    Word<C>(const Word<C>& copyObg) { 
     size=copyObg.getSize(); 
     bitCells=copyObg.bitCells; 
    } 
} 

我有錯誤,與拷貝構造函數,在intilizeing大小的線,我得到: 「在這一行 多個標記 - 過客‘常量字< 16>’作爲「這INT字的論點 '::的getSize()與詮釋C = 16]' 丟棄預選賽[ - fpermissive] - 參數無效 '考生:整數的getSize()'」

什麼是錯與此? 謝謝

+2

第一步:在構造函數名稱後面刪除''。 –

+1

根據該錯誤,您的代碼片段中不包含的成員'getSize()'是非''const'成員:使其成爲'const'成員。 –

+0

是這樣的:「Word(const Word &copyObg)」?這是爲什麼? (仍然是相同的錯誤..) – Atheel

回答

0

問題是你的getSize()沒有被宣佈爲const。讓它如此:

int getSize() const { return size; } 
3

我會寫的類是這樣的:

template <std::size_t N> 
class Word 
{ 
    std::array<int, N> bit_cells_; 

public: 
    static constexpr std::size_t size = N; 

    Word() : bit_cells_{} {} 

    // public functions 
}; 

注:

  • 無需動態的大小,因爲它是類型的一部分。

  • 不需要特殊的成員函數,因爲隱式定義的函數很好。

  • 通過constructor-initializer-list將成員數組初始化爲零。

  • 模板參數是無符號的,因爲它代表了一個計數。

+0

關於你的最後一點:這具有破壞類似'static_assert(N> = 0,「數組大小必須爲正值」);'的負面後果,'如果Word的模板參數爲不是一個負整數,而是一些編譯時計算的負面結果('Word ')。這與使用無符號函數參數的問題基本相同。 –

+0

@ChristianHackl:的確,這是一個引起爭議的話題。 –