具有函数模板和重载的 C++ 类
Posted
技术标签:
【中文标题】具有函数模板和重载的 C++ 类【英文标题】:C++ class with function templates and overloading [closed] 【发布时间】:2012-11-12 19:09:22 【问题描述】:我希望在 C++ 中创建一个序列化类以满足我正在处理的项目的需要。考虑以下几点:
class serializer
private:
void s(int in, std::string &out);
void d(std::string in, int &out);
public:
template<typename T> void serialize(T in, std::string &out)
s(in, out);
;
template<typename T> void deserialize(std::string in, T &out)
d(in, out);
;
;
我是模板新手,所以我在那里做的一定有什么非常错误的,因为它不会链接抱怨“未定义的引用”:
undefined reference to `void serializer::serialize<int>
(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
当这样调用时:
serializer s;
int t = 0;
std::string str;
s.serialize(t, str);
我想要做的是有一个具有两个公共方法 serialize
和 deserialize
的类,无论它们的参数类型如何,都可以调用它们,并且每个方法都会根据函数重载调用适当的私有函数。
我做错了什么?
编辑:
问题是链接器错误是错误的。问题不在于函数模板,而在于 s()
和 d()
函数,它们在 .cpp 文件中未正确声明为类的成员。所以错误源于函数模板无法调用d()
和s()
,因为它们没有被定义,只是被声明,生效。
【问题讨论】:
你能发布哪些引用是未定义的吗? @Angew 也加入了通话 只是为了确定。serialize()
和 deserialize()
的主体包含在其头文件中的类定义中,对吧?
@Angew 是的,你在上面看到的是头文件。
@MooingDuck @zneak 而不是定义 serializer::d()
我只定义了 d()
[facepalm] -- 我想我应该添加有关问题的完整信息。
【参考方案1】:
问题很可能是你在.cpp文件中指定了s
和d
而没有explicit template instantiation的类型。尝试仅在头文件中实现这些方法。
【讨论】:
这不是问题,但它确实是这样编译的,只是找出了真正的问题。以上是关于具有函数模板和重载的 C++ 类的主要内容,如果未能解决你的问题,请参考以下文章