2015-06-14 13 views
5

Nếu tôi lấy địa chỉ của toán tử dịch phải và chuyển nó làm tham số mẫu, biểu tượng thay đổi phải đang bị đọc sai khi kết thúc danh sách tham số mẫu và sự nhầm lẫn kết quả là gây ra nhiều lỗi.Lỗi cú pháp khi toán tử dịch phải được sử dụng làm tham số mẫu

template <class T, void(T::*)(int)> struct TemplateMagic {}; 
struct TestStruct { void operator>> (int) {} }; 

int main() { 
//All the errors are on this line: 
    TemplateMagic<TestStruct, &TestStruct::operator>> >* ptr; 
} 

Chạy này trong Microsoft Visual Studio Express 2013 cho Windows Desktop Version 12.0.31101.00 Cập nhật 4 mang đến cho các lỗi sau đây:

lỗi C2143: cú pháp lỗi: thiếu ';' trước khi '>'

lỗi C2275: 'TestStruct': sử dụng trái phép loại hình này như là một biểu

lỗi C2833: 'điều hành>' không phải là một nhà điều hành công nhận hoặc gõ

As far as Tôi có thể biết, các ký hiệu operator>> > đang bị chia nhỏ sao cho nó đọc nó là operator>, theo sau là chấm dứt > để đóng các đối số mẫu và kết thúc bằng một phụ tùng > cho lulz. Tôi cho rằng đây là một lỗi.

Có cách nào để viết lại điều này để nó được nhận dạng là hợp lệ không?

+0

Bạn đã thử đặt nó vào dấu ngoặc đơn: 'TemplateMagic >)> * ptr;'? –

Trả lời

3

Chỉ cần thêm dấu ngoặc đơn xung quanh &TestStruct::operator>> sẽ buộc MSVC phân tích cú pháp chính xác.

Mã này biên dịch with MSVC 19.00.23008.0:

template <class T, void(T::*)(int)> struct TemplateMagic {}; 
struct TestStruct { void operator>> (int) {} }; 

int main() { 
    TemplateMagic<TestStruct, (&TestStruct::operator>>) >* ptr; 
} 

Các "lừa" thêm dấu ngoặc đơn sẽ làm việc trong nhiều tình huống mà một biểu hiện rất mơ hồ hoặc hiểu lầm bởi trình biên dịch.

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