1

次のようなグローバル関数があります。

namespace X
{
namespace Y
{
template <R, ...T>
R foo(T&&... args)
{
    R r(args...);
    return r;
}
}
}

次に、別のクラスで、この関数を のフレンドとしてA宣言します。だから私はした:fooA

class A
{
template <R, ...T>
friend R X::Y::foo(T&&... args);
A(int x, int y){}
};

X::Y::foo<A>(4, 5)ここで、 foo が のプライベート コンストラクターにアクセスできないというエラーでコンパイルに失敗すると呼び出しますA。エラーを理解できません。 を正しくfooフレンドとして宣言するにはどうすればよいですか?A

前もって感謝します。

4

1 に答える 1

2

テンプレート パラメーターとパラメーター パックの構文上の問題を修正した後、次のように動作するようです。

namespace X
{
    namespace Y
    {
        template <typename R, typename ...T>
        R foo(T&&... args)
        {
            R r(args...);
            return r;
        }
    }
}

class A
{
    template <typename R, typename ...T>
    friend R X::Y::foo(T&&... args);
    A(int x, int y){}
};

int main()
{
    X::Y::foo<A>(1, 2);
}

上記のコードのコンパイルの実際の例を次に示します。

于 2013-05-03T14:44:38.980 に答える