0

私が取り組んでいるプロジェクトのニーズに合わせて、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);

私がやろうとしているのは、2 つのパブリック メソッドを持つクラスを持ちserializedeserialize引数の型に関係なく呼び出すことができ、それぞれが関数のオーバーロードに基づいて適切なプライベート関数を呼び出すことです。

私は何を間違っていますか?

編集:

問題は、リンカ エラーが間違っていることです。問題は関数テンプレートではなく、クラスのメンバーとして .cpp ファイルで適切に宣言されていないs()および関数にあります。d()したがって、エラーは関数テンプレートが呼び出せd()s()、定義されておらず、宣言されただけであるため、実際には発生します。

4

1 に答える 1

1

この問題は、タイプの明示的なテンプレートのインスタンス化なしで .cpp ファイルにsandを指定した可能性があります。これらのメソッドをヘッダー ファイルだけに実装してみてください。d

于 2012-11-12T19:50:23.687 に答える