非专业模板中模板专业化的成员访问
Posted
技术标签:
【中文标题】非专业模板中模板专业化的成员访问【英文标题】:Member access of template specialisation in unspecialised template 【发布时间】:2015-08-01 01:33:28 【问题描述】:以下代码编译失败(使用 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 中的技巧。但我宁愿不要因为我可能只是在密集的事情而诉诸这种级别的黑客技术。
【问题讨论】:
【参考方案1】:你friend
-ing 方法不对。 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
;
【讨论】:
啊,是的...我的老朋友掌心向我打招呼了。 有什么方法可以更严格地做到这一点?那是为了确保 FooFoo<1>
重命名为...Bar
。如果他们做不同的事情,为什么要他们共享一个模板?
长话短说:它是复杂性质的遗留代码,而且高层很合理,不希望我在添加新错误的情况下搞得太多。这个问题与增加封装的小尝试有关,这将有助于防止对象 Foo以上是关于非专业模板中模板专业化的成员访问的主要内容,如果未能解决你的问题,请参考以下文章