2

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

typedef string Type;
Type initVal(); 
class Exercise {
public:
    typedef double Type;
    Type setVal(Type); 
    Type initVal(); 
private:
    int val;
};

Type Exercise::setVal(Type parm) {  
    val = parm + initVal();    
    return val;
}
4

3 回答 3

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;
}
于 2015-07-29T04:27:28.253 回答
0

该代码无法编译,我无法梳理出它应该做什么,但我认为你的问题的答案是参数是 type Exercise::Type,而返回值是 type ::Type,即全局 typedef。如果你想让它们匹配,当你setVal在类定义之外定义时,你需要将返回值完全指定为Exercise::Type,如下所示:

typedef string Type;

class Exercise {
public:
    typedef double Type;
    Type setVal(Type);
    Type initVal() { return 1.0; }
private:
    int val;
};

Exercise::Type Exercise::setVal(Type parm) {
    val = parm + initVal();
    return val;
}
于 2015-07-29T03:09:12.867 回答
-1

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

于 2015-07-29T02:45:08.833 回答