2009-11-26 36 views
8

Hãy xem xét mã sau:Tôi không thể truy cập vào con trỏ tới thành viên. Tại sao?

template<class T, class F>   struct X {}; 
template<class T, class F, T F::* m> struct Y {}; 

struct Foo { 
    int member; 
    typedef X<int, Foo>    x_type; // works well 
    typedef Y<int, Foo, &Foo::member> y_type; // ERROR 
}; 

typedef Y<int, Foo, &Foo::member> y_type2; // OK 

Tại sao trình biên dịch tạo lỗi? (VS2008)


New

Tôi đã gửi lỗi này để connect.microsoft.com.

+1

trình biên dịch gì bạn đang sử dụng? Không có lỗi nào với g ++ 4.3.3. – sth

+0

Lỗi được trình biên dịch trả về là gì? – luc

+2

Tôi không thể hiểu bản khai của mẫu "Y". Thông số mẫu là một trong hai loại hoặc giá trị tích phân. "TF :: * m" không phải là một loại, mà bạn có thể parametrize mẫu của bạn ... Khi bạn viết "Y ", tham số cuối cùng không phải là một loại và không một giá trị tích phân. Nó là một con trỏ tới thành viên. Vì vậy, tôi tin rằng, nó phải bị từ chối ... – SadSido

Trả lời

1

Đây là một bug

+1

Đó là những gì tôi đã nói (http://stackoverflow.com/questions/1802204/i-can-not-get-access-to-pointer-to-member-why/1802365#1802365) –

7

Tôi nghĩ rằng nó có liên quan bằng cách nào đó với Visual C++ không biết kích thước của con trỏ đến thành viên tại điểm đó. Kiểm tra this báo cáo lỗi ví dụ (here là một vấn đề khác với con trỏ đến biến thành viên). Tôi nghĩ rằng bạn tìm thấy một lỗi Visual C++ và nó sẽ được báo cáo cho connect.microsoft.com.

+0

Tôi trùng với lý thuyết 'lỗi'. Tôi tình cờ gặp vấn đề tương tự gần đây, và tìm thấy - nhưng không nhớ ở đâu - rằng họ chưa 'hỗ trợ đầy đủ' các đối số lớp mẫu con trỏ tới thành viên. – xtofl

+0

Tuy nhiên, trình biên dịch không cần biết _size_, imho. – xtofl

+0

Tôi có nghĩa là 'sizeof (& Foo :: member)' có thể là 1 hoặc nhiều hơn tùy thuộc vào khai báo 'Foo'. –

0

Tôi tình cờ gặp phải vấn đề tương tự. Sự hỗ trợ đối số mẫu con trỏ tới thành viên vẫn bị giới hạn trong VC++ (xem bug report).

Trong trường hợp của tôi, tôi có thể giải quyết nó bằng cách sử dụng hàm mẫu i.s.o. một lớp mẫu:

template< typename Class > struct CMemberDumper { 
    Class& object; 
    template< typename M > void visit_member(M C::*pm) { 
     std::cout << object.*pm; 
    } 
}; 
+3

Lỗi của bạn không liên quan đến vấn đề của tôi. Nó hoạt động tốt mà không có bất kỳ lỗi trình biên dịch nào. Tôi sử dụng VS2008. –

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