2017-10-10 57 views
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++編譯器的錯誤。解決這些問題的任何提示?

+2

這是一個怪異的情況。 +1 – StoryTeller

+1

這看起來可能是由於缺少對VS中兩階段查找的適當支持而造成的。認爲[VS團隊正在研究它](https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/)。這種類型的問題可以通過使用命名約定來避免,該命名約定要求函數名稱,類型名稱,變量名稱等的名稱不同。 – VTT

回答

9

這是MSVC++中的一個錯誤。在模板定義期間,兩階段查找需要將Type解析爲模板參數的名稱和基數!

在實例化處有這樣一個成員的事實不應該干涉。當模板正確執行時,它不會如您使用GCC所記錄的那樣。

但是微軟沒有正確實施它until recently。在他們的實現中,模板的行爲更像是一個宏,這是錯誤的原因。