具有函数模板和重载的 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);

我想要做的是有一个具有两个公共方法 serializedeserialize 的类,无论它们的参数类型如何,都可以调用它们,并且每个方法都会根据函数重载调用适当的私有函数。

我做错了什么?

编辑:

问题是链接器错误是错误的。问题不在于函数模板,而在于 s()d() 函数,它们在 .cpp 文件中未正确声明为类的成员。所以错误源于函数模板无法调用d()s(),因为它们没有被定义,只是被声明,生效。

【问题讨论】:

你能发布哪些引用是未定义的吗? @Angew 也加入了通话 只是为了确定。 serialize()deserialize() 的主体包含在其头文件中的类定义中,对吧? @Angew 是的,你在上面看到的是头文件。 @MooingDuck @zneak 而不是定义 serializer::d() 我只定义了 d() [facepalm] -- 我想我应该添加有关问题的完整信息。 【参考方案1】:

问题很可能是你在.cpp文件中指定了sd而没有explicit template instantiation的类型。尝试仅在头文件中实现这些方法。

【讨论】:

这不是问题,但它确实是这样编译的,只是找出了真正的问题。

以上是关于具有函数模板和重载的 C++ 类的主要内容,如果未能解决你的问题,请参考以下文章

C++中函数模板和模板函数的区别

函数重载与函数模板 - C++

C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板

C++入门C++ 函数模板&类模板

C++学习:5其他语法

C++ 函数重载,函数模板和函数模板重载,选择哪一个?