次のコードがあります。
gcc-3.4、gcc-4.3、Intel コンパイラでは問題なくコンパイルできますが、MSVC9 では失敗します。
MSVC は、「c_traits<C>
クラス テンプレート メンバー関数void foo<C>::go(void)
を C=short でコンパイルする際に、未定義の型を使用する」と通知します。
このクラスはまったく使用されていないため、コンパイラは未使用のクラスの未使用のメンバー関数をインストールしようとします。
メンバー関数を特殊化するのではなく、クラス foo 全体を特殊化することで、この問題を回避できます。しかし、クラス全体を専門化することは、さまざまな理由で私にとって少し問題があるということです。
大きな疑問:何が正しいのか?
- 私のコードは間違っていますか? gcc と intel コンパイラは foo を完全にインストールしないため、問題を無視します。
- コードは正しく、これは未使用のメンバー関数をインストールしようとする MSVC9 (VC 2008) のバグですか?
コード:
class base_foo {
public:
virtual void go() {};
virtual ~base_foo() {}
};
template<typename C>
struct c_traits;
template<>
struct c_traits<int> {
typedef unsigned int_type;
};
template<typename C>
class foo : public base_foo {
public:
static base_foo *create()
{
return new foo<C>();
}
virtual void go()
{
typedef typename c_traits<C>::int_type int_type;
int_type i;
i=1;
}
};
template<>
base_foo *foo<short>::create()
{
return new base_foo();
}
int main()
{
base_foo *a;
a=foo<short>::create(); delete a;
a=foo<int>::create(); delete a;
}