私は学校の課題のために小さなカレンダーライブラリを作成する最終段階にあり、予期しない非常に紛らわしい問題に遭遇しました。テンプレートを導入するときに、代入演算子が上書きされることはありません。
Date
したがって、構造は次のようになります。ほとんど純粋仮想関数(代入演算子を含む)を持つ抽象クラスがあり、次に2つのサブクラスがGregorian
あり、Julian
そのすべての関数を実装します。最後に、クラスのテンプレートを作成しました。このテンプレートには、Calendar
今日の日付(Gregorian
またはJulian
オブジェクトの形式)と、この特定の問題に実際には関係のないその他のものが含まれています。
問題は、このメンバーtoday
を設定しようとすると、長いリンカーエラーが発生することです。
エラー4エラーLNK2019:未解決の外部シンボル "public:virtual class lab2 :: Date&__ thiscall lab2 :: Date :: operator =(class lab2 :: Date const&)"(?? 4Date @ lab2 @@ UAEAAV01 @ ABV01 @@ Z)関数 "public:class lab2 :: Gregorian&__ thiscall lab2 :: Gregorian :: operator =(class lab2 :: Gregorian const&)"(?? 4Gregorian @ lab2 @@ QAEAAV01 @ ABV01 @@ Z)C: \ Users ...\test.objカレンダー
クラスoperator=
内で関数が見つからないことを教えてください(明らかに、それは純粋に仮想であるため)。Date
オーバーライドされたものを使用しないのはなぜですか?Gregorian::operator=
それは私に電話をかけようとしていると
言っていますDate::operator=
か?
物事がうまくいかない単純化されたコードは次のとおりです。
namespace cal_lib {
template <typename T>
class Calendar {
public:
Calendar() {
today = T(); // this yields the error
}
private:
T today;
};
}
そして、これがGregorian.cppからの抜粋です:
namespace cal_lib {
class Gregorian : public Date {
public:
Gregorian();
virtual Gregorian& operator=(const Date& date);
virtual Date& add_year(int n = 1);
virtual Date& add_month(int n = 1);
};
// here I'm using Date's constructor to get the current date
Gregorian::Gregorian() {}
Gregorian& Gregorian::operator=(const Date& date) {
if (this != &date) {
// these member variables are specified as
// protected in Date
m_year = 1858;
m_month = 11;
m_day = 17;
add_year(date.mod_julian_day()/365);
add_month((date.mod_julian_day() - mod_julian_day())/31);
operator+=(date.mod_julian_day() - mod_julian_day());
}
}
}
Dateの(デフォルトの)コンストラクターはm_year
、m_month
との値m_day
を今日の日付に設定するだけです。
Date::Date() {
time_t t;
time(&t);
struct tm* now = gmtime(&t);
m_year = now->tm_year + 1900;
m_month = now->tm_mon + 1;
m_day = now->tm_mday;
}
これは完全に正常に機能することは注目に値します。
Gregorian g;
Julian j;
g = j; // no problems here
Date* gp = new Gregorian();
Date* jp = new Julian();
*gp = *jp; // no problems here either
これは、Calendar
クラスがインスタンス化される方法です。
using namespace cal_lib;
Calendar<Gregorian> cal;
ここで私がしている非常に明白な間違いがありますか?