2010-04-01 32 views
5

Tôi có một lớp nhưC++ rõ ràng mẫu chuyên môn của constructor templated của lớp templated

template <class T> 
struct A{ 
    template <class U> 
    A(U u); 
}; 

Tôi muốn viết một chuyên môn hóa rõ ràng điều này cho một tuyên bố như

A<int>::A(float); 

Trong thử nghiệm sau mã, nếu tôi nhận xét chuyên môn hóa, nó biên dịch với g ++. Nếu không, nó nói tôi có sai số thông số mẫu:

#include <iostream> 

template <class T> 
struct A{ 
    template <class U> 
    A(T t, U *u){ 
     *u += U(t); 
    } 
}; 

template <> 
template <> 
A<int>::A<int,float>(int t, float *u){ 
    *u += float(2*t); 
} 

int main(){ 
    float f = 0; 
    int i = 1; 
    A<int>(i, &f); 
    std::cout << f << std::endl; 
    return 0; 
} 
+1

Nhân tiện, hãy tạo tham số 'U & u' thay vì con trỏ. Nó an toàn hơn và dễ dàng hơn. – GManNickG

Trả lời

4

Hãy thử

template <> 
template <> 
A<int>::A(int t, float *u){ 
    *u += float(2*t); 
} 

Đó dường như làm việc cho tôi.

+0

Rất tiếc, tôi có lỗi đánh máy; U nên nổi, hãy để tôi sửa lỗi đó. –

+0

Ok, điều này dường như làm việc, nhưng nó dựa vào việc xác định các tham số ngầm. Đây có phải là cách duy nhất để làm điều đó không? –

+0

Đây cũng là những gì hoạt động trên VC++ 2008. – conio

1

Danh sách tham số chức năng của định nghĩa phải khớp với khai báo.

template <> 
template <> 
A<int>::A<float>(int t, float *u){ 
    *u += U(2*t); 
} 
+0

với 'U' được thay bằng phao, biên dịch này với Comeau, nhưng nó không biên dịch với gcc – smerlin

+1

Tôi tìm thấy http://gcc.gnu.org/bugzilla/show_bug.cgi?id=9050. Vấn đề là cụ thể đối với các nhà xây dựng. – Potatoswatter

Các vấn đề liên quan