6

我有以下类层次结构:

template <typename T>
class base
{
public:
   void f() {}
};

class class_a : public base<class_a> {};

class class_b : public base<class_b>, 
                public class_a 
{ 
   using base<class_b>::f; 
};

int main()
{
   class_b b;
   b.f();
   return 0;
}

Comeu 和 Intel C++ v11 声称一切都很好,但是 GCC (4.4.1) 和 VC++ 2008 似乎抱怨 ( http://codepad.org/KQPDsqSp ),例如:

g++ -pedantic -Wall -o test test.cpp 
test.cpp: In function ‘int main()’:
test.cpp:5: error: ‘void base<T>::f() [with T = class_b]’ is inaccessible
test.cpp:14: error: within this context 

我相信代码的格式是正确的,但是我可能是错的,我希望 SO C++ 社区的某个人可以对这个问题提供一些见解。

注意:在 class_b 中的 using 指令之前添加“public”,解决了 gcc 和 VS 的问题。应用 using 指令的类的访问器部分是否应该覆盖基类的派生模式(公共、私有)?

简而言之就是这个

  • 编译器错误 - 如果是 GCC、VS 或 Comeu、Intel 哪个编译器
  • 上面的代码格式正确吗?
  • 调用 using 指令的访问器部分是否覆盖了基类的派生模式?
4

1 回答 1

3

您在这里所做的是通过将符号导入类私有命名空间来解决歧义。因此,它是方法阴影并将其可见性更改为私有。您不能拥有两个具有完全相同原型的函数,既私有又公有,因此 f 现在是私有的。

至少 GCC 认为using 应该能够改变函数的可见性。

然而,在GCC 错误数据库中发现的模糊参考表明,使用实际上不应该受到范围的影响。

最重要的是,直接回答(C++ Standard '03 -- 7.3.3/15)

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

因此,答案将是:

  • 这是Comeau中的一个错误
  • 不,代码格式不正确,至少在 C++03 方面(在 C++0x N3000 中找不到任何相关内容)
  • 是的,您可以更改访问范围
于 2010-02-02T01:41:34.983 回答