クラスをデータベースに結合する従来の ORM があり、VS2008 および VS2012 で正常にコンパイルされます。VS2012 コード分析の機能を使用してみましたが、コンパイル エラー C2975 および C2440 が発生します。問題を特定するために、関連するコードを取り出しました。
#include <string>
#include <vector>
#include <typeinfo>
typedef std::vector<unsigned char> byte_packet;
// RTTI option (/GR) required
template<const std::type_info &ref_type_info> struct _TypeOf { /* blank to cause compile error for unsupported types */ };
template<> struct _TypeOf<typeid(std::string)> { typedef std::string typed; };
template<> struct _TypeOf<typeid(int)> { typedef int typed; };
template<> struct _TypeOf<typeid(unsigned int)> { typedef unsigned int typed; };
template<> struct _TypeOf<typeid(double)> { typedef double typed; };
template<> struct _TypeOf<typeid(byte_packet)> { typedef byte_packet typed; };
template<> struct _TypeOf<typeid(time_t)> { typedef time_t typed; };
#define TYPEOF(x) _TypeOf<typeid(x)>::typed
int _tmain(int argc, _TCHAR* argv[])
{
int i = 1;
TYPEOF(i) j;
j = i;
return 0;
}
template<> 行ごとに次のエラーのペアが表示されます。
error C2975: 'ref_type_info' : invalid template argument for '_TypeOf', expected compile-time constant expression
error C2440: 'specialization' : cannot convert from 'int' to 'const type_info &'
コンパイラは typeid<...> をテンプレートの int 引数として扱うようです。TYPEOF() マクロは、マクロの引数と同じ型の新しい変数を宣言するために使用されます。このマクロは他のマクロに埋め込まれており、これを行うための代替/より良い方法を受け入れています。そのままで動作しますが、VS2012 のコード分析機能が停止し、その理由がわかりません。
どんな助けでも大歓迎です。ありがとう。