【发布时间】:2012-03-02 15:59:17
【问题描述】:
向this one提出后续问题。
基本上,在下面的代码中,为什么编译器会认为Cs构造函数中A<B>里面的B引用了B基类的(不可访问的)构造函数?
struct B{};
template <typename T>
struct A : private T{};
struct C : public A<B>{
C(A<B>); // ERROR HERE
};
prog.cpp:1:9: 错误:'struct B B::B' 不可访问
prog.cpp:7:7: 错误:在此上下文中
请注意,如果将构造函数参数更改为A<B*>、A<B&> 甚至A<const B>,则会弹出相同的错误。另请注意,MSVC10、GCC 4.7 和 Clang 3.1 ToT 中的三个将出错,因此它必须是 C++ 规范中的内容。 这是什么?
【问题讨论】:
-
我不知道您为什么创建完全相同的主题!您可以编辑该主题以使其成为更好的主题。
-
@Nawaz:这是一个根本不同的问题。我问“为什么”,另一个问题是“做什么”。
-
伙计,我不止一次被
class A : private NotCopyable { class B : private NotCopyable {} };咬过。我猜它在查看全局范围之前先在类范围内查找符号。 -
@Xeo:这就是为什么我说您可以编辑该主题以使其变得更好。
-
@AndréCaron:那个特定的例子编译得很好。
标签: c++ templates scope c++11 base-class