不合格的查找和(可能)依赖的基类

时间:2010-09-24 14:05:25

标签: c++

考虑以下计划:

template <typename T>
struct t
{
    struct base { void f1(); };
    struct derived : base
    {
        void f2()
        {
            f1();
        }
    };
};

derived::f2中,使用非限定查找来查找f1。会base被搜查吗?会base::f1会被找到吗? base是依赖类型吗?

请使用标准中的引号来证实您的答案。

2 个答案:

答案 0 :(得分:8)

是的,base是依赖的,因此找不到f1。在C ++ 03中,addition 14.6.1/2d(在C ++ 98中不存在)和C ++ 0x中明确了这一点,14.6.2.1/6(n3126)直接说明了这一点。 。

它的依赖性很重要,因为以下是可能的

// for T = int, f1 does not exist.
template<> struct t<int>::base { };

答案 1 :(得分:0)

这不适合评论框...

gcc拒绝代码:

there are no arguments to 'f1' that depend on a template parameter, so a declaration of 'f1' must be available

然而,在this->之前引入f1会使其依赖,然后编译才能生效。

据我的经验显示,同样的行为适用于:

  • 类型(您必须再次typedef
  • 方法(您需要使用using base::f1this->f1

我已经看到了这种行为:

  • gcc 3.4
  • VC ++ 9
  • VC ++ 10

现在我们可以等标准分析师从标准中获得准确的报价。