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ます。クラス内で行われた宣言のいずれとも一致しません。コードの形式が正しくありません。

非修飾の戻り値の型名をクラス スコープでも検索する場合は、関数宣言で新しい末尾の戻り値の型構文を使用します。この構文では、戻り値の型が関数の宣言子 IDの後に続くためです。

auto Exercise::setVal(Type parm) -> Type {  
    val = parm + initVal();    
    return val;
}
于 2015-07-29T04:27:28.253 に答える
0

そのコードはコンパイルされず、それが何をすべきかを理解するのに苦労していますが、あなたの質問に対する答えは、パラメーターが typeExercise::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 に答える