13

.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 */

serialize()メソッドの実装を.cpp ファイルに次のように書き込もうとしました。

#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'

これを行う適切な方法はどのようですか?

4

1 に答える 1

8

できません*。テンプレートからインスタンス化されたコードを使用するすべての .cpp ファイルにアクセスできるように、テンプレートをヘッダー ファイルに配置する必要がある理由を最初に考えてください (テンプレートはオンデマンドでのみインスタンス化されます)。

したがって、ある意味では、クラス テンプレートは、データ レイアウト (データ メンバー) のテンプレートと、メンバー関数ごとに 1 つずつある一連のテンプレートと考えることができます。したがって、テンプレート クラスのすべてのメンバーはテンプレートとして扱われます。クラス テンプレートのメンバー関数を明示的に特殊化することもできます。

*いつものように、明示的なインスタンス化がオプションである場合は、.cpp ファイルでメンバー関数を定義し、その .cpp ファイルで必要なすべての明示的なインスタンス化を提供できます。

于 2013-06-03T07:44:50.893 に答える