8
下面的代碼片段在MSVC C不++編譯(2015年,2017年):模板參數名稱衝突與方法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);
編譯器困惑並解釋調用Type
構造函數調用的Type()
方法我試圖從中衍生出來的課程。 GNU C++編譯器對代碼沒有問題。
重命名模板參數在Base類聲明中輸入不同的東西(不與任何基類的任何方法相沖突)解決了這個問題。添加類似: (typename Type)(type)
沒有幫助。
這是MSVC C++編譯器的錯誤。解決這些問題的任何提示?
這是一個怪異的情況。 +1 – StoryTeller
這看起來可能是由於缺少對VS中兩階段查找的適當支持而造成的。認爲[VS團隊正在研究它](https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/)。這種類型的問題可以通過使用命名約定來避免,該命名約定要求函數名稱,類型名稱,變量名稱等的名稱不同。 – VTT