以下使用声明的重点是什么
using eoPop<MOEOT>::size;
using eoPop<MOEOT>::operator[];
using eoPop<MOEOT>::back;
using eoPop<MOEOT>::pop_back;
取自定义为here的班级。当然,因为eoPop<EOT>
继承std::vector<EOT>
,方法size
,operator[]
,back
和pop_back
是公开的,所以不需要使用声明。 using声明是否用于强制实例化?
答案 0 :(得分:2)
虽然我不知道为什么他们决定包含那些 using-declarations ,但我可以说明为什么没有它们就会形成错误的代码。
但首先,从评论中重复:
using-declaration 不要求指定实体存在定义(这里:它不要求存在这些函数的定义)。考虑:
void foo();
int main()
{
using ::foo; // doesn't require the definition of `foo` to exist
return 0;
}
如果类模板被隐式实例化,则会实例化其成员函数的声明,但不会实例化它们的定义(根据[temp.inst] / 1)。如果隐式实例化所述类模板,则实例化类模板的基类(这反过来导致实例化那些基类模板的成员函数的声明)。因此, using-declaration 对实例化没有帮助。
using-declarations 的效果是声明的名称对于非依赖名称查找是可见的。根据[temp.dep] / 3
在类或类模板的定义中,如果基类依赖于模板参数,则在非限定名称查找期间不会检查基类范围。
在链接代码中,我们找到了例如i<size()
。此处的名称size
是非依赖的,因此不会搜索基类范围,如果没有 using-declaration ,则无法找到eoPop < MOEOT > :: size
。
使用 using-declarations 的另一个原因是,如果要重载基类的成员函数。如果不使用using-decl,派生类中的成员函数只会隐藏基类中的每个重载(具有相同的名称)。据我所知,链接代码中没有使用它。