模板类中的C ++非模板方法

时间:2013-06-03 07:13:47

标签: c++ templates struct

在.cpp文件的模板类(struct)中编写非模板方法的实现是否可行?我已经读过模板方法应该写在.h上,但我的方法不是模板方法,尽管它属于模板类。这是我的.h中的代码:

#include <iostream>

#ifndef KEY_VALUE_H
#define KEY_VALUE_H

using namespace std;

namespace types
{
    template <class T, class U>
    struct key_value
    {
        T key;
        U value;

        static key_value<T, U> make(T key, U value)
        {
            key_value<T, U> kv;

            kv.key = key;
            kv.value = value;

            return kv;
        };

        string serialize()
        {
            // Code to serialize here I want to write in .cpp but fails.
        }
    };
}


#endif /* KEY_VALUE_H */

我尝试在.cpp文件中编写方法serialize()的实现,如下所示:

#include "key_value.h"

using namespace types;

template <class T, class U>
string key_value<T, U>::serialize()
{
    // Code here returning string
}

结束时出现错误:Redefinition of 'serialize'

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:8)

* 是不可能的。想一想为什么模板首先需要在头文件中:这样使用从模板实例化的代码的每个.cpp文件都可以访问它(模板只按需要实例化)。

因此,在某种程度上,您可以将类模板视为数据布局的模板(数据成员)以及一组模板,每个模板用于每个成员函数。因此,模板类的所有成员都被视为模板。您甚至可以明确地专门化类模板的成员函数。

* 与往常一样,如果显式实例化是一个选项,您可以在.cpp文件中定义成员函数,并在该.cpp文件中提供所有必需的expicit实例化。