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;
}