0

Visual Studio 2010で以下のコードをコンパイルしようとすると、未解決の外部シンボルに関する2つのエラーが発生します。この問題は、関数内で関数を使用しているためだと確信していますが、間違っていることを具体的には知りません。コードは私には問題ないように見えます。

#include <iostream>

using namespace std;

class fraction
{
  public:
    int gcd(int, int);
    void simplifyfraction();
  private:
    int integral, numerator, denominator;
};

int main(){
    return 0;
}

int gcd(int numerator, int denominator)
{
    if (denominator > numerator)
       return gcd(denominator, numerator);
    if (numerator == denominator)
       return numerator;
    if (numerator%denominator == 0)
       return denominator;
    return gcd(numerator, numerator-denominator);
}


void fraction::simplifyfraction()
{
    int mygcd;
    mygcd = gcd(numerator, denominator);
    numerator = numerator/mygcd;
    denominator = denominator/mygcd;
}
4

2 に答える 2

5

の定義はクラス名で修飾されておらず、クラスで宣言されたメンバー関数とは異なるgcd()独立した関数として扱われます。gcd()fraction

Asはコンパイラgcd()から呼び出され、 という名前の関数を検索し、最初に見つかった関数は と同じスコープで宣言されています。つまり、定義がありません (完全に定義された独立した関数は見つかりません)。その後、リンカーは、未解決のシンボルがあると不平を言います。fraction::simplifyfraction()gcd()simplifyfraction()fraction::gcd()gcd()

変更を修正するには:

int fraction::gcd(int numerator, int denominator)
{
}

これは、メンバー関数として持たないことで修正された可能性があることに注意してくださいgcd()(のメンバー変数にアクセスせずfraction、すべての変数が引数として渡されます)、またはgcd()inの呼び出しを次のfraction::simplifyfraction()ように変更できます。

mygcd = ::gcd(numerator, denominator);
于 2012-12-15T09:15:19.433 に答える
1

gcd の実装は、それ自体が分数のメンバー関数であると宣言していません。

あなたは書く必要があります:

int fraction::gcd(int numerator, int denominator)
于 2012-12-15T09:15:55.550 に答える