【发布时间】:2013-12-06 10:24:40
【问题描述】:
我已经坐了很长时间了。我只是找不到答案,所以如果你们能提供帮助,那就太好了。
涉及两个类,一个 (XMLParser) 正在从 ifstream 中读取并反序列化对象并将它们存储在本地验证中。第二个是持有vector<Someclass *> 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<Someclass>(std::vector<SomeClass*, std::allocator<Someclass*> >*)'的链接时,当然提供了XMLParser.o。
我尝试过的,除其他外:
包括分配器:template<class T> void fill(std::vector<T*, std::allocator<T*> > *vec) -> 相同的错误
为填充宽度写一个专业化 Someclass: template <> void XMLParser::fill(std::vector<Someclass*> *vec) -> 工作!但不是我想要的
我在网上搜索了一些示例,但没有一个为模板提供分配器类,所以这似乎不是办法。 专业化正在发挥作用,但有人知道为什么我需要为可能出现的每个课程提供专业化吗?有办法吗?因为如果我必须为可能在 XML 中的每个类提供专门化,它就不会非常通用。
谢谢 马丁
【问题讨论】:
-
@texasbruce
typename不是必需的,甚至是不允许的。
标签: c++ templates generics vector member