私が取り組んでいるプロジェクトのニーズに合わせて、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 つのパブリック メソッドを持つクラスを持ちserialize
、deserialize
引数の型に関係なく呼び出すことができ、それぞれが関数のオーバーロードに基づいて適切なプライベート関数を呼び出すことです。
私は何を間違っていますか?
編集:
問題は、リンカ エラーが間違っていることです。問題は関数テンプレートではなく、クラスのメンバーとして .cpp ファイルで適切に宣言されていないs()
および関数にあります。d()
したがって、エラーは関数テンプレートが呼び出せd()
ずs()
、定義されておらず、宣言されただけであるため、実際には発生します。