非特定模板中模板特化的成员访问权限

时间:2015-05-20 01:41:17

标签: c++ templates

以下代码无法编译(使用clang):

template<int N>
class Foo {
    public:
        Foo() : value(N) { }

        void getValue(Foo<1>& foo)
        {
            value = foo.value;
        }

    protected:
        int value;
};

int main(int argc, const char * argv[])
{
    Foo<1> fooOne = Foo<1>();

    Foo<2> fooTwo = Foo<2>();

    fooTwo.getValue(fooOne);

    return 0;
}

错误为main.cpp:21:15: error: 'value' is a protected member of 'Foo<1>'。这一切都很好。

我的问题是有没有办法让朋友工作?例如,以下代码产生相同的错误,但我希望它能够起作用。

template<int N>
class Foo {
    public:
        Foo() : value(N) { }

        friend class Foo<1>;

        void getValue(Foo<1>& foo)
        {
            value = foo.value;
        }

    protected:
        int value;
};

我当然可以非常可怕,并使用Accessing protected member of template parameterhttp://www.gotw.ca/gotw/076.htm中的技巧。但是我宁愿不采取那种程度的hackery来解决我可能只是密集的问题。

1 个答案:

答案 0 :(得分:2)

你是friend - 错误的方式。它Foo<N>需要成为Foo<1>的朋友,因为它需要访问Foo<1>的内部;您正在Foo<1> friend Foo<N>。为简单起见,您可以只friend全部:

template <int N>
class Foo {
    // mass inter-Foo friendship
    template <int > friend class Foo;

    // rest as you had before
};