2015-07-22 66 views
2

如何將模板類對象的引用放置在不同的(模板化的,但我不確定相關的)類中?引用模板類/對象的數據成員

目前,我有(簡體):

template <typename T, size_t D> 
class Field 
{ 
public: 
    template <size_t meshDim> 
    Field(const Mesh<meshDim>& mesh, const std::string &fileName): 
    fileName_(fileName), 
    meshDim_(meshDim), 
    mesh_(mesh) // <- this also doesn't compile, 
       // although I think it would if I had a data member named 
       // mesh_ that compiled 
    { 
     for (unsigned int d=0; d<D; d++) { 
      field_[d].reserve(mesh.numCells()); 
     } 
    } 

private: 
    std::vector<T> field_[D]; 
    std::string fileName_; 
    const size_t meshDim_; 
    template<size_t meshDim> 
    const Mesh<meshDim> &mesh_; // <- This doesn't compile 
}; 

這擊中編譯時錯誤:data member 'mesh_' cannot be a member template。這個關於variable templates的鏈接讓我覺得我想要做什麼(或者至少與我正在嘗試做的事情類似)應該可以使用c++14,但可能不會使用c++11

如果我的const Mesh<meshDim> &mesh_;線之前刪除template<size_t meshDim>行(除去模板參數也,以避免發生不可預料meshDim),然後有人告訴我,我正在做invalid use of template-name 'Mesh' without an argument list,這是有道理的。

如果我離開<>,但沒有參數(不是我期望的這個工作,但嘗試任何東西),我得到wrong number of template arguments (0, should be 1)

這可能嗎?我是否需要製作一些/所有東西的一些/所有部分static或者也許constexpr

原則上,應該只有一個Mesh對象,我確定,試圖使它成爲一個constexpr構造,因爲它需要的參數可以#define d。通過構建系統,如果需要的話。

回答

5

在您當前的代碼中,您的字段類行爲顯式依賴於meshDim。至少這就是你的代碼所說的。所以,你需要parametrise它的網格尺寸:

template< typename T, size_t D, size_t meshDim> 
class Field { 
    // ... 
    Field(mesh<meshDim> & m); 
    // ... 
    mesh<meshDim> & mesh_; 
}; 

如果現場的行爲不直接取決於網目尺寸,例如它可以採取任何網,那麼你需要給它一個參考一類,不依賴於網格尺寸'S:

class IMesh { 
    virtual void doStuff(void) = 0; // your interface 
    // ... 
}; 
template<size_t meshDim> 
class Mesh : public IMesh { // vtable or similar means required now 
    // ... 
}; 

template< typename T, size_t D> 
class Field { 
    // ... 
    Field(IMesh &); 
    // ... 
    IMesh & mesh_; // Reference, so no slicing 
}; 

關於可變模板:他們不會解決你的問題:

When used at class scope, variable template declares a static data member template. (Source)

......這是有道理的,因爲如果你的非靜態數據成員可以有變量模板,那麼在它的聲明中計算一個對象的大小將是不可能的,因爲那樣你就不知道將會做什麼實例化。

+0

感謝您爲此 - 模擬'meshDim'參數上的'Field'類是我認爲合適的解決方案,因爲我也可以刪除成員變量'meshDim_',它(已經)在某些地方明確使用。再多幾個'template class Field <....>;'要寫的聲明... – chrisb2244

0

您引用的頁面表示它們只能是靜態數據成員。

刪除rtemplate聲明並插入一個數字 例如const網格< 15> & mesh_;不會編譯,所以看起來問題出在模板上。

N3651不建議模板參數可以用作變量的模板參數。 (雖然這似乎是模棱兩可的)

相關問題