2010-07-21 143 views
2

請考慮下面的代碼:模板的朋友和嵌套類

template <typename T> 
struct foo 
{ 
    template <typename S> 
    struct bar 
    { 
     template <typename> friend struct bar; 
    }; 
}; 

我想的foo<T>::bar所有實例是的foo<T>::bar<S>朋友任何S。如果bar不是嵌套模板,則上面的語法工作得很好。但是,當我如做

int main() 
{ 
    foo<int> x; 
} 

MSVC8(的Visual C++ 2005)不喜歡它:

1>.\main.cpp(11) : error C3855: 'foo<T>::bar': template parameter 'S' is incompatible with the declaration 
1>  .\main.cpp(12) : see reference to class template instantiation 'foo<T>::bar<S>' being compiled 
1>  .\main.cpp(14) : see reference to class template instantiation 'foo<T>' being compiled 

如果我使用

template <typename> friend struct foo<T>::bar; 

,而不是編譯器給了我同樣的錯誤。我怎樣才能達到我想要的?

編輯:我DOUBLE(它的上午在這裏,我真的不清醒)檢查,這似乎是一個VC8 bug

+4

似乎在我的機器上工作。儘管如此編譯器。 – DumbCoder 2010-07-21 09:09:57

+0

我複製粘貼上面的確切代碼,不包括,我複製粘貼錯誤消息。 – 2010-07-21 09:11:18

回答

2

一類或類模板的朋友的所有限制在第14.5.3描述C++標準。你的代碼是有效的。檢查您是否安裝了Visual Studio的所有最新Service Pack。 Here你可以在Visual Studio中找到相關的錯誤。

+0

謝謝,它似乎確實是一個VC8的錯誤。不幸的是,我不能改變編譯器,所以我會和公共成員一起去。 – 2010-07-21 09:36:29

+0

[This](https://connect.microsoft.com/VisualStudio/feedback/details/262353/compile-error-when-making-a-template-class-a-friend-of-itself-works-on-vc7 -1和-gcc-3-4-4#細節)bug很可能是同一個問題。考慮安裝VC8的服務包。 – 2010-07-21 09:41:20