2015-07-22 70 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不建议模板参数可以用作变量的模板参数。 (虽然这似乎是模棱两可的)

相关问题