Tôi đã sau đoạn mã: trình biên dịchSử dụng hợp lệ hàm thành viên tĩnh của lớp mà không thể được cài đặt
Nó biên dịch không có vấn đề dưới gcc-3.4, gcc-4.3, intel, nhưng thất bại dưới MSVC9.
MSVC nói "sử dụng không xác định loại c_traits<C>
, khi biên dịch lớp mẫu hàm thành viên void foo<C>::go(void)
với C = ngắn.
Điểm nó trình biên dịch sẽ cố gắng để cài đặt chức năng thành viên không sử dụng các lớp không sử dụng, vì lớp này chỉ là không được sử dụng ở tất cả.
tôi có thể làm việc xung quanh vấn đề bằng cách chuyên toàn bộ foo lớp thay vì chuyên hàm thành viên của nó. Nhưng điểm nó mà chuyên toàn bộ lớp là một chút vấn đề đối với tôi vì những lý do khác nhau.
Câu hỏi lớn: điều gì là đúng?
- là mã của tôi sai và gcc và intel trình biên dịch chỉ cần bỏ qua vấn đề này bởi vì họ không cài đặt foo đầy đủ, hoặc
- Mã này là đúng và đây là lỗi của MSVC9 (VC 2008) mà nó cố gắng để cài đặt chức năng thành viên không được sử dụng?
Mã:
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;
}
+1 cho mã đẹp, súc tích, có thể kết hợp. – GManNickG