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;

代わりは。どうすれば私が望むことを達成できますか?

編集:私はダブルチェックしました(ここは朝です、そして私は本当に起きていません)、これはVC8のバグのようです:

4

1 に答える 1

2

クラスまたはクラステンプレートのフレンドに対するすべての制限14.5.3は、C++標準のセクションで説明されています。コードは有効です。VisualStudioの最新のサービスパックがすべてインストールされていることを確認してください。ここでは、VisualStudioの関連するバグを見つけることができます。

于 2010-07-21T09:34:48.040 に答える