C++ 我们是否需要在嵌套类型的成员参数前面加上“:”:&引用;? 例如,考虑以下名称:名称 NEST1 < /C> >: template <typename U> class nest1 {}; class cls { public: template <typename V> class nest1 {}; template <typename W> class nest2 { public: void bar(nest1<W> x); }; }; template <typename W> void cls::nest2<W>::bar(nest1<W> x) {} // how does compiler know which nest<1>? 模板类nest1{}; cls类{ 公众: 模板类nest1{}; 模板类nest2{ 公众: 空心钢筋(nest1 x); }; }; 模板 void cls::nest2::bar(nest1 x){}//编译器如何知道哪个嵌套? 如果我们不在cls::前面加上bar(例如bar(cls::nest1 x)),编译器如何知道bar是采用nest1还是cls::nest1 明确地在cls::前面加前缀是一种好做法吗

C++ 我们是否需要在嵌套类型的成员参数前面加上“:”:&引用;? 例如,考虑以下名称:名称 NEST1 < /C> >: template <typename U> class nest1 {}; class cls { public: template <typename V> class nest1 {}; template <typename W> class nest2 { public: void bar(nest1<W> x); }; }; template <typename W> void cls::nest2<W>::bar(nest1<W> x) {} // how does compiler know which nest<1>? 模板类nest1{}; cls类{ 公众: 模板类nest1{}; 模板类nest2{ 公众: 空心钢筋(nest1 x); }; }; 模板 void cls::nest2::bar(nest1 x){}//编译器如何知道哪个嵌套? 如果我们不在cls::前面加上bar(例如bar(cls::nest1 x)),编译器如何知道bar是采用nest1还是cls::nest1 明确地在cls::前面加前缀是一种好做法吗,c++,class,templates,nested,C++,Class,Templates,Nested,注意:编译器实际上选择隐式声明bar(cls::nest1 x): 调用cls::nest1 x;巴(x)工作: 通过nest1 x;巴(x)失败: 在成员函数名之后使用的每个名称也会在其类的词法范围内查找。这会导致以下(看似)不一致的行为,因为正常返回类型不在类的词法范围内: struct X{ struct Y{}; Y foo(Y); Y bar(Y); }; // normal return type is before 'foo', needs explicit sc

注意:编译器实际上选择隐式声明
bar(cls::nest1 x)

  • 调用
    cls::nest1 x;巴(x)工作:
  • 通过
    nest1 x;巴(x)失败:

在成员函数名之后使用的每个名称也会在其类的词法范围内查找。这会导致以下(看似)不一致的行为,因为正常返回类型不在类的词法范围内:

struct X{
  struct Y{};

  Y foo(Y);
  Y bar(Y);
};

// normal return type is before 'foo', needs explicit scope qualification
// parameter doesn't (after 'foo')
X::Y X::foo(Y y){ return y; }

// trailing-return-type also doesn't (after 'bar')
auto X::bar(Y y) -> Y{ return y; }
关于这方面的标准,我们看一下
§9.3[class.mfct]p5

如果成员函数的定义在词汇上超出其类定义,则应使用
运算符通过其类名限定成员函数名。[注意:成员函数定义中使用的名称(即,在包含默认参数的参数声明子句(8.3.6)或成员函数体中)如3.4所述进行查找。-结束注意][…]

然后在
§3.4.1[basic.lookup.unqual]p8
(不合格的名称查找,例如没有
):

在函数的声明器id
31[…]之后的
X
类成员函数(9.3)定义中使用的名称应通过以下方式之一声明:

  • [……]
  • 应为
    X
    类成员或
    X
    (10.2)基类成员,或
  • [……]

(我的示例中的声明器ID是
foo
bar

与具有相同名称的全局变量和静态数据成员时相同。因此,它只需剥离层并在最近的父/祖先类中找到所需的声明?哦,我假设它会选择全局的。你可能应该在你的问题中具体说明这一点。