引用模板化类/对象的数据成员

时间:2015-07-22 04:34:40

标签: c++ templates c++11 c++14

如何在不同的模板中放置对模板化对象的引用(模板化,虽然我不确定是否相关)?

目前我已经(简化):

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,但可能不会用{{} 1}}。

如果我删除c++11行之前的template<size_t meshDim>行(同时删除模板参数,以避免未定义const Mesh<meshDim> &mesh_;),那么我被告知我正在制作{ {1}},这是有道理的。

如果我离开meshDim,但没有争论(不是我希望这可行,而是尝试任何事情),我得到invalid use of template-name 'Mesh' without an argument list

这可能吗?我是否需要制作某些/所有内容<>wrong number of template arguments (0, should be 1)的部分/全部内容?

原则上,应该只有一个static对象,我可以尝试将其设为constexpr构造函数,因为它需要的参数可以是Mesh d by如果需要,构建系统。

2 个答案:

答案 0 :(得分:5)

在您当前的代码中,您的字段类行为明确地依赖于meshDim。至少那是你的代码所说的。因此,您需要在网格维度上对其进行参数化:

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

如果字段的行为不直接取决于网格大小,例如它可以采用任何网格,然后你需要给它一个不依赖于网格大小的类的引用:

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

关于变量模板:它们无法解决您的问题:

  

在类范围内使用时,变量模板声明静态数据成员模板。   (Source)

...这是有道理的,因为如果你可以拥有非静态数据成员的变量模板,就不可能在它的声明中计算对象的大小,因为那时你无法知道将要进行什么样的实例化。

答案 1 :(得分:0)

您所引用的页面表示它们只能是静态数据成员。

删除rtemplate声明并插入数字 例如,const Mesh&lt; 15&gt; &安培; mesh_;编译所以看起来问题似乎与模板有关。

同样N3651并不建议模板参数可以用作变量的模板参数。 (虽然这似乎含糊不清。)