0

我在一种模板层次结构中有一堆相关的指标,看起来像

template <int level>
struct index{
    index<level - 1> w;
    int x, y;
};

template <> struct index<0> { int x, y; };

template <int level>
struct data;

以及一个应该生成和缓存由它们索引的对象的类。我想对这个类使用 pimpl,我想知道是否有一种方法可以使用模板将函数调用转发到实现类。就像是

class Cache{
    template <int level>
    shared_ptr<data<level>> get_data(const index<level> & index);
};  
4

1 回答 1

1

简而言之,不(如果我正确理解您的问题)。

问题是在转发器的实现点,您需要实现类的完整定义(而不仅仅是声明)。如果你想为此目的使用模板成员函数,你需要在每个使用它们的编译单元中定义它们,即通常在你声明它们的同一个头文件中。这意味着需要在声明接口类的同一标头中定义实现类(这会破坏首先对类进行 pimpling 的目的)。

(如果您的编译器支持export关键字,您可以单独定义模板方法,因此在这种情况下它会起作用。实际上,Comeau 是我所知道的唯一支持的编译器export,并且它已从 C++11 中完全删除)。

比较如何使用模板函数避免链接器错误?在 C++-FAQ-lite 中。

于 2012-04-06T17:56:45.087 回答