2

グローバル関数をクラスの「フレンド」として宣言しようとしています:

namespace first
{
    namespace second
    {
        namespace first
        {
            class Second
            {
                template <typename T> friend T ::first::FirstMethod();
            };
        }
    }
}

このコードを Visual C++ 2008 でコンパイルすると、次のようになります。

error C3254: 'first::second::first::Second' : class contains explicit override 'FirstMethod' but does not derive from an interface that contains the function declaration
error C2838: 'FirstMethod' : illegal qualified name in member declaration

template <typename T> friend T first::FirstMethod();代わりに使用すると、次のようになります。

error C2039: 'FirstMethod' : is not a member of 'first::second::first'

フレンド関数を宣言する適切な方法は何ですか?

4

1 に答える 1

5

あなたは偶然私のクイズに当たりました - シーケンスは単一の名前T ::first:: ...として解釈されます. コロンと の間にトークンを入れる必要があります。リンクされた質問にも解決策が示されています。T

いずれにせよ、最初にそれぞれの名前空間でも修飾名で指定された関数を宣言する必要があることに注意してください。


編集:構文の問題にはさまざまな解決策があります

 template <typename T> friend T (::first::FirstMethod)();
 template <typename T> T friend ::first::FirstMethod();

外側の名前空間を頻繁に参照する必要があり、この構文に問題がある場合は、名前空間エイリアスを導入できます

    namespace first
    {
        namespace outer_first = ::first;
        class Second
        {
            template <typename T> friend T outer_first::FirstMethod();
        };
    }
于 2010-07-02T17:08:26.260 に答える