访问私有嵌套类定义的行为不一致
Inconsistent behaviour accessing private nested class definition
我有代码将子类模板声明为私有,然后将成员声明为受保护:
class X {
private:
template <class T>
class Y {
public:
void somethingToDo();
// definition
};
protected:
Y<SomeType> _protectedMember;
// More definition
};
class Z : public virtual X{
public:
void f();
}
void Z::f() {
...
_protectedMember.somethingToDo();
}
最初我用 gcc 4.3.4 编译了它,它接受了它。 然后我把它发出去,试图在各种平台上针对GCC,IBM和Microsoft编译器进行构建,但非gcc编译器拒绝了它。 现在,这似乎是对(此版本的)gcc标准合规性的控诉。 但在我得出任何结论之前,我想验证一下技术上是正确的。
谢谢。
你的程序对我来说似乎是有效的(好吧,除了Y::somethingToDo
荒谬的私有)。 Z::f()
没有要求访问任何private
名称,只要求访问protected
名称。
如果Z::f()
试图引用Y<T>
,那么编译器应该出错。但是Z::f()
只是访问_protectedMember
,这肯定是允许的。
我很
确定我以前见过这个。 这是当时GCC中的一个已知错误,此后已得到修复。
您Y
模板是私有的,不能用于非私有的代码中,例如_protectedMember
打算从派生类访问的女巫,您还应该将其声明为受保护,以便其成员对派生类可见。
作为一般规则,如果您希望变量完全可访问某个作用域,则其类型必须在该作用域中完全可访问。 当然,在以下情况下,您的代码对于当前设计很有用:
class Base {
class PrivateClass {};
protected:
PrivateClass _val;
void doSomething( PrivateClass& v );
}
现在,派生类可以使用_val
来调用doSomething
但它们不能调用其方法或使用其属性。
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 从 C 字符串构造 std::string 与从另一个 std::string 构造 std::string 不一致
- 这种比较是否不一致(或者存在其他问题)?
- 以下可变参数模板行为是否不一致?
- 如何修复我的链表读数不一致的问题?
- C++:不一致的 std::p ow( 类型 ) 定义
- 访问私有嵌套类定义的行为不一致
- 声明和定义之间常量限定符的使用不一致
- 这种编译器优化不一致是否完全由未定义的行为来解释
- 类中定义的友元函数模板是否可用于查找?clang++和g++不一致
- struct和int之间clang中的重新定义不一致