以下代码无法编译(使用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 parameter或http://www.gotw.ca/gotw/076.htm中的技巧。但是我宁愿不采取那种程度的hackery来解决我可能只是密集的问题。
答案 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
};