【问题标题】:C++ Non Template Method in Template Class模板类中的 C++ 非模板方法
【发布时间】: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 文件的那些助手。这样,您可以通过不让编译器为不同的模板实例化重复这些函数来抑制 模板膨胀

标签: c++ templates struct


【解决方案1】:

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

所以在某种程度上,您可以将类模板视为数据布局(数据成员)的模板加上一组模板,每个成员函数一个模板。因此,模板类的所有成员都被视为模板。您甚至可以显式特化类模板的成员函数。

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

【讨论】:

  • 哦,所以不可能。好吧,我想我应该像上面评论中所说的那样将实现放在其他实用程序类中。感谢您的输入先生! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多