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

时间:2015-02-16 19:19:55

标签: c++ visual-c++ gcc compiler-errors clang

考虑以下(人为)示例:

class A {
 public:
  template <typename T>
  class C {};
};

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

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

它与GCC和Clang成功编译,但Visual C ++ 2010出现以下错误:

  

test.cpp(13):错误C2247:&#39; A :: C&#39;无法访问,因为&#39; B&#39;使用&#39;私人&#39;继承自&#39;

这是Visual C ++中的错误还是这段代码确实无效?

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

1 个答案:

答案 0 :(得分:5)

[namespace.udecl] / P18:

  

using-declaration 创建的别名具有通常的含义   成员声明的可访问性。

这里不多说。名称B::C可公开访问,代码格式正确。只是另一个MSVC错误。