※ ChatGPTを利用し、要約された質問です(原文:コンパイルエラー。間違ってるのは誰?(どこ?))
コンパイルエラー。間違ってるのは誰?(どこ?)
このQ&Aのポイント
template<typename T>クラス内で定義されたfriend関数にてコンパイルエラーが発生しています。エラーメッセージによると、引数の型変換に関連してエラーが起こっているようです。
コンパイルエラーは、変換コンストラクタがconst修飾されたRational<T>型をRational<T>&型に変換できないというエラーが原因です。
このエラーを回避するためには、friend関数の引数にconst修飾と参照を外す必要があります。これは、コードが誤った型変換をしているのではなく、テンプレートクラスの仕様に関連したエラーです。
Effective C++の「型変換をさせたいなら、メンバでない関数をクラステンプレートの中で定義しよう」という項目に乗っていたコードを実験してみたのですが、コンパイルでエラーが出るようです。
-----
template<typename T>
class Rational
{
T numerator_value;
T denominator_value;
public:
Rational(const T& num=0, const T& den=1)
:numerator_value(num), denominator_value(den){}
const T numerator(){return numerator_value;}
const T denominator(){return denominator_value;}
void show() const
{
std::cout<<"numerator="<<numerator_value<<": denominator="<<denominator_value<<std::endl;
}
friend const Rational operator*(const Rational& lhs, const Rational& rhs) //←引数がおかしい?
{
return Rational(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator());
}
};
int main()
{
Rational<int> obj1(1,10);
Rational<int> obj2;
obj2=obj1*10;
obj2.show();
return 0;
}
-----
こういうコードを書いたのですが、friend関数の部分で「'const Rational<T>' から 'Rational<T> &' へ 'this' ポインタを変換できません」等と怒られます。
引数に取る二つの値のどちらもおかしいようで、コンパイルのエラーを出さないようにするためには、constと&を外さないといけないようです。
引数はEffectiveC++の掲載コードをそのまま使っています。
これは、私のコードがおかしいのか、本のコードがおかしいのかどちらでしょうか?
お礼
ああ、そういえば......orz その通りで御座います。 回答ありがとう御座いましたm(__)m