gpt4 book ai didi

c++ - 无法访问 vc++10 中的模板私有(private)继承

转载 作者:可可西里 更新时间:2023-11-01 18:33:27 25 4
gpt4 key购买 nike

以下代码使用 GCC 4.4.6 和 Comeau 4.3.10 编译。

#include <iostream>

struct A { int name; };
template<typename T> struct C : T { using T::name; };
struct B : private A { friend struct C<B>; };

int main()
{
C<B> o;
o.name = 0;
}

它在 VC++10 中给出以下错误:

main.cpp(4): error C2877: 'A::name' is not accessible from  'A'
main.cpp(10): error C2247: 'A::name' not accessible because 'B' uses 'private' to inherit from 'A'

什么是允许 o.name = 0; 的交叉编译器解决方法? ?

注意:添加using A::nameB解决了这个问题,但发布了 A::name每个人的成员,而它应该只对特定的模板实例可见,即 C<B> .

最佳答案

解决方法是@kerrekSB 建议的,添加 using A::name;在类里面B :

struct A { int name; };
template<typename T> struct C : T { using T::name; };

struct B : private A {
using A::name;
friend struct C<B>;
};

你最初的例子没有工作因为类A属于B的私有(private)和类 C<B>B的 friend 但是当你访问成员(member)时 name来自 C<B> 的对象, 线 using T::name;自类 B 以来产生问题没有任何成员name在里面。这是查找成员的范围搜索 name当您尝试通过类 B 的对象访问它时

编辑:

Adding using A::name to B takes care of the problem, but publishes the A::name member to everyone, whereas it should only be visible to a particular template instantiation, namely C

如果是这样,那么只需声明语句 using A::name;在类里面的私有(private)部分 B

struct B : private A {
protected: using A::name;
public:
friend struct C<B>;
};

关于c++ - 无法访问 vc++10 中的模板私有(private)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12294422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com