名称查找和类范围

时间:2015-07-29 02:38:56

标签: c++ c++11 scope name-lookup class-members

为什么setVal的返回类型是string类型,参数类型是double类型

SwingUtilities.invokeLater()

3 个答案:

答案 0 :(得分:4)

当在命名空间范围内定义成员函数时,C ++为跟随 declarator-id (3.4.1 / 8)的非限定名称提供特殊名称查找规则。在查找命名空间范围之前,会在类范围中查找这些名称。

由于"普通"中的返回类型成员函数定义函数的 declarator-id 之前,上述特殊规则不适用于它。它按照"通常"规则:在命名空间范围内。

因此,您的函数定义的返回类型是::Type,而不是Exercise::Type。它与类中的任何声明都不匹配。代码格式不正确。

如果您希望在类范围中查找非限定返回类型名称,请在函数声明中使用新的尾随返回类型语法,因为在此语法中返回类型如下函数的 declarator-id

auto Exercise::setVal(Type parm) -> Type {  
    val = parm + initVal();    
    return val;
}

答案 1 :(得分:0)

该代码无法编译,我无法弄清楚它应该做什么,但我认为您的问题的答案是参数类型为{{1 ,返回值的类型为Exercise::Type,即全局typedef。如果您希望它们匹配,那么在类定义之外定义::Type时,您需要将返回值完全指定为setVal,如下所示:

Exercise::Type

答案 2 :(得分:-1)

因为局部变量会自动覆盖全局变量。