考虑以下计划:
template <typename T>
struct t
{
struct base { void f1(); };
struct derived : base
{
void f2()
{
f1();
}
};
};
在derived::f2
中,使用非限定查找来查找f1
。会base
被搜查吗?会base::f1
会被找到吗? base
是依赖类型吗?
请使用标准中的引号来证实您的答案。
答案 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::f1
或this->f1
)我已经看到了这种行为:
现在我们可以等标准分析师从标准中获得准确的报价。