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?
Đây là một tình huống khó chịu. +1 – StoryTeller
Đ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