【发布时间】:2013-06-03 07:13:47
【问题描述】:
是否可以在 .cpp 文件的模板类(结构)中编写非模板方法的实现?我读过模板方法应该写在.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.不要将
using namespace std;放在头文件中。 2. 在标题中定义方法。 -
不会序列化使用模板化成员数据类型?所以它取决于模板的类型,并且对于每个实例类型都会有所不同。
-
如果您为每种可能的模板类型组合实例化模板,您可以将定义放在 cpp 文件中。
-
如果序列化成员函数真正独立于模板参数,我怀疑在这种情况下,你可以将它移动到你的模板类的非模板基类并在 .cpp 文件中实现它。
-
你可以——通常应该——将不依赖于模板参数的模板类中的非模板方法重构为非模板帮助类的成员函数,以及您可以放入 .cpp 文件的那些助手。这样,您可以通过不让编译器为不同的模板实例化重复这些函数来抑制 模板膨胀。