C++ 为什么使用using声明引入私有基类的成员模板是不可访问的?

C++ 为什么使用using声明引入私有基类的成员模板是不可访问的?,c++,visual-c++,gcc,compiler-errors,clang,C++,Visual C++,Gcc,Compiler Errors,Clang,考虑以下(人工)示例: A类{ 公众: 模板 C类{}; }; B类:私人A{ 公众: 使用A::C; }; int main(){ B::C; } 它用GCC和Clang编译成功,但Visual C++ 2010给出以下错误: test.cpp(13):错误C2247:“A::C”不可访问,因为“B”使用“private”从“A”继承 这是VisualC++中的一个bug还是这个代码确实无效? 如果C不是模板,则代码将在所有编译器上编译。[namespace.udecl]/p18: 使用声明

考虑以下(人工)示例:

A类{
公众:
模板
C类{};
};
B类:私人A{
公众:
使用A::C;
};
int main(){
B::C;
}
<>它用GCC和Clang编译成功,但Visual C++ 2010给出以下错误:

test.cpp(13):错误C2247:“A::C”不可访问,因为“B”使用“private”从“A”继承

这是VisualC++中的一个bug还是这个代码确实无效? 如果

C
不是模板,则代码将在所有编译器上编译。

[namespace.udecl]/p18:

使用声明创建的别名具有通常的 成员声明的可访问性


这里没什么好说的。名称
B::C
可以公开访问,并且代码格式良好。只是另一个MSVC漏洞。

可能与此有关:我将使用VC漏洞。@JonathanPotter感谢链接。看起来确实有些关联。太糟糕了,那里的答案没有说明哪个编译器是正确的。@t.C.我也这么认为,尽管这可能是标准中的一个差距。
class A {
 public:
  template <typename T>
  class C {};
};

class B : private A {
 public:
  using A::C;
};

int main() {
  B::C<int> c;
}