【问题标题】:C++ passing vector<Class*> to template member [duplicate]C ++将vector <Class *>传递给模板成员[重复]
【发布时间】:2013-12-06 10:24:40
【问题描述】:

我已经坐了很长时间了。我只是找不到答案,所以如果你们能提供帮助,那就太好了。

涉及两个类,一个 (XMLParser) 正在从 ifstream 中读取并反序列化对象并将它们存储在本地验证中。第二个是持有vector&lt;Someclass *&gt; objVec;,因此是一个向量,它持有指向特定类型对象的指针。我是这样把它们放在一起的:

ifstream file(filename, ifstream::in);
if (file.is_open())
{
    XMLParser xmlParser;
    file >> xmlParser;
    xmlParser.fill(&objVec);
    file.close();
}

XMLParser.h:

class XMLParser
{
private:
vector<Someclass> someVec;
vector<SomeOtherclass> someOtherVec;
public:
    template<class T> void fill(std::vector<T*> *vec);
    friend std::istream &operator>>(std::istream &stream, XMLParser &ob);
};
std::istream& operator>>(std::istream &stream, XMLParser &ob);

XMLParser.cpp:

std::istream& operator>>(std::istream &stream, XMLParser &ob)
{
    //deserialize objects from stream and store them locally
    return stream;
}

template <class T> void XMLParser::fill(std::vector<T*> *vec)
{
    //fill the vector with the right objects
}

一切都编译良好,没有错误或警告。但是当我得到一个undefined reference to 'void XMLParser::fill&lt;Someclass&gt;(std::vector&lt;SomeClass*, std::allocator&lt;Someclass*&gt; &gt;*)'的链接时,当然提供了XMLParser.o。

我尝试过的,除其他外: 包括分配器:template&lt;class T&gt; void fill(std::vector&lt;T*, std::allocator&lt;T*&gt; &gt; *vec) -> 相同的错误 为填充宽度写一个专业化 Someclass: template &lt;&gt; void XMLParser::fill(std::vector&lt;Someclass*&gt; *vec) -> 工作!但不是我想要的

我在网上搜索了一些示例,但没有一个为模板提供分配器类,所以这似乎不是办法。 专业化正在发挥作用,但有人知道为什么我需要为可能出现的每个课程提供专业化吗?有办法吗?因为如果我必须为可能在 XML 中的每个类提供专门化,它就不会非常通用。

谢谢 马丁

【问题讨论】:

  • @texasbruce typename 不是必需的,甚至是不允许的。

标签: c++ templates generics vector member


【解决方案1】:

你需要在.cpp文件的头文件中定义模板不是。该标准要求模板定义存在于它声明的每个翻译单元中(如果使用)。

【讨论】:

    【解决方案2】:

    有两种方法可以解决此问题。 第一个,也是迄今为止最常见的,是将模板减速放在 h 文件中(不仅仅是定义)。这可以通过将其写入 h 中来完成,或者(不太常见)包括 h 中的 .cpp 文件。

    另一种选择是在 cpp 文件中为您要使用的每种类型显式实例化模板。

    标准状态另一个选项:在模板减速之前使用“导出”,同时将定义保留在 cpp 文件中。但是,我不知道有任何编译器真正支持这一点(它可能在当前标准中也被删除了)。这样做的问题是,如果使用它,cpp 编译之间存在依赖关系(我可以更改模板定义,而不更改 h 文件,并且所有使用此模板的 cpp 文件都必须重新编译(即使 h没有改变..)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多