我有以下代码:
它在 gcc-3.4、gcc-4.3、intel 编译器下编译没有问题,但在 MSVC9 下编译失败。
MSVC 告诉“使用未定义类型,同时使用 C=shortc_traits<C>
编译类模板成员函数。void foo<C>::go(void)
编译器试图安装未使用类的未使用成员函数,因为这个类根本没有使用。
我可以通过专门化整个类 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;
}