2011-07-02 24 views
5
struct Test 
{ 
     template <class T> 
     void print(T& t) 
    { 
     t.print(); 
    } 
}; 

struct A 
{ 
    void print() {printf("A");} 
}; 

struct B 
{ 
    void print() {printf("B");} 
}; 

void test_it() 
{ 
    A a; 
    B b; 

    Test t; 
    t.print(a); 
    t.print(b); 
} 

Việc biên dịch này tốt.Khấu trừ đối số cho các hàm thành viên mẫu không hoạt động đối với các lớp được khai báo bên trong hàm?

struct Test 
{ 
     template <class T> 
     void print(T& t) 
    { 
     t.print(); 
    } 
}; 


void test_it() 
{ 
    struct A 
    { 
     void print() {printf("A");} 
    }; 

    struct B 
    { 
     void print() {printf("B");} 
    }; 

    A a; 
    B b; 

    Test t; 
    t.print(a); 
    t.print(b); 
} 

này thất bại với lỗi: chức năng không phù hợp cho cuộc gọi đến 'Test :: in (test_it() :: Một &)'

bất cứ ai có thể giải thích cho tôi tại sao điều này xảy ra? Cảm ơn !!!

+0

không chắc chắn 100%, nhưng có thể là do Thử nghiệm nằm trong phạm vi toàn cầu nên không thể 'thấy' A và B có chức năng cục bộ – stijn

Trả lời

8

Trong ví dụ thứ hai của bạn, AB nhiều loại địa phương, mà không thể được sử dụng như các đối số mẫu kiểu trong C++ 03 theo §14.3.1/2:

Một địa phương loại, loại không có liên kết, loại không được đặt tên hoặc loại được kết hợp từ bất kỳ loại nào trong số này sẽ không được sử dụng làm đối số mẫu cho tham số loại mẫu.

+3

@Alexander K .: Lưu ý rằng C++ 0x nâng giới hạn này. 'gcc-4.6.0 -std = C++ 0x' biên dịch ví dụ thứ hai tốt. –

+0

+1 xác nhận những gì tôi mong đợi nhưng trong 'tiêu chuẩn' lingo:] – stijn

+0

Cảm ơn rất nhiều thông tin. –

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