テンプレート クラスを作成し、テンプレート パラメーターの typeid に応じて異なるアクションを実行する場合、これをどのようにコーディングすればよいでしょうか?
たとえば、次のテンプレート クラスがあり、int か string かに応じてメンバー フィールド データを初期化します。
#include <string>
template <class T>
class A
{
private:
T data;
public:
A();
};
// Implementation of constructor
template <class T>
A<T>::A()
{
if (typeid(T) == typeid(int))
{
data = 1;
}
else if (typeid(T) == typeid(std::string))
{
data = "one";
}
else
{
throw runtime_error("Choose type int or string");
}
}
ただし、このコードは、次のメイン ファイルではコンパイルされません。
#include "stdafx.h"
#include "A.h"
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
A<int> one;
return 0;
}
エラーは次のとおりです: エラー C2440: '=' : 'const char [2]' から 'int' に変換できません。コードのその部分に到達します。
次に、この例 (テンプレート変数の型に基づいて異なるメソッドを実行する) に従って、次の Ah ファイルを試しましたが、A(void) が A.obj で既に定義されていることを示すいくつかのリンカー エラーが発生しました。
#include <string>
template <class T>
class A
{
private:
T data;
public:
A();
~A();
};
// Implementation of constructor
template <>
A<int>::A()
{
data = 1;
}
template <>
A<std::string>::A()
{
data = "one";
}
このコードを起動して実行する方法を知っている人はいますか? また、テンプレート クラスでそのような if-else ステートメントを使用すると、テンプレートの機能が失われる可能性があることも認識しています。これをコーディングするより良い方法はありますか?
編集: Torsten (下記) との話し合いの後、次の Ah ファイルができました。
#pragma once
#include <string>
// Class definition
template <class T>
class A
{
public:
A();
~A();
private:
T data;
};
// Implementation of initialization
template < class T >
struct initial_data
{
static T data() { throw runtime_error("Choose type int or string"); }
};
template <>
struct initial_data< int >
{
static int data() { return 1; }
};
template <>
struct initial_data< std::string >
{
static std::string data() { return "one"; }
};
// Definition of constructor
template <class T>
A<T>::A()
: data( initial_data< T >::data() )
{
}
そして次のメイン:
#include "stdafx.h"
#include "A.h"
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
A<int> ione;
return 0;
}
私が今得るリンカーエラーは次のとおりです: Test template 4.obj : error LNK2019: unresolved external symbol "public: __thiscall A::~A(void)" (??1?$A@H@@QAE@XZ) referenced in関数 _wmain