2017-10-10 12 views
8

Sau đoạn không biên dịch trong MSVC C++ (2015, 2017):Template tên tham số va chạm với phương pháp trong MSVC C++

template <typename Type> 
struct Base : public Type 
{ 
    Base(const Type & type) 
    : Type(type) 
    {} 
}; 

struct SomeType 
{ 
    int Type() { return 42; } 
}; 

struct Wrong : public Base<SomeType> 
{ 
    Wrong(const SomeType & type) 
    : Base<SomeType>(type) 
    {} 
}; 

SomeType some; 
Wrong wrong(some); 

Trình biên dịch được nhầm lẫn và giải thích cách gọi constructor Type với một cuộc gọi đến Type() phương pháp lớp tôi cố gắng xuất phát từ. Trình biên dịch GNU C++ không có vấn đề với mã.

Đổi tên đối số mẫu Nhập vào khai báo lớp cơ sở cho một thứ khác (không va chạm với bất kỳ phương thức nào của lớp cơ sở) giải quyết được sự cố. Thêm một số thứ như : (typename Type)(type) không giúp ích gì.

Đây có phải là lỗi trình biên dịch MSVC C++ không. Bất kỳ mẹo nào để giải quyết các loại vấn đề này?

+2

Đây là một tình huống khó chịu. +1 – StoryTeller

+1

Điều này có vẻ như có thể do thiếu sự hỗ trợ thích hợp cho tra cứu hai pha trong VS. Tư tưởng [Đội VS đang làm việc trên nó] (https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/). Các vấn đề loại như vậy có thể tránh được bằng cách sử dụng quy ước đặt tên yêu cầu kiểu tên khác nhau cho tên hàm, tên loại, tên biến và vv. – VTT

Trả lời

9

Đây là lỗi trong MSVC++. Tra cứu hai pha yêu cầu Type để được giải quyết là tên của thông số mẫu và một cơ sở, trong mẫu định nghĩa!

Thực tế có thành viên như vậy tại thời điểm khởi tạo không được can thiệp. Khi các mẫu được triển khai đúng, nó không giống như bạn đã lưu ý với GCC.

Nhưng Microsoft đã không triển khai chính xác until recently. Trong quá trình triển khai, một mẫu hoạt động giống macro hơn, đó là nguyên nhân gây ra lỗi.

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