前提・実現したいこと
C++ のライブラリで Boost というのがあるのですが、その中に Operators という一部の演算子オーバーロードから、関連する演算子オーバーロードを自動定義するものがあります。
私は、その Operators と同等の機能を自分でも作れないかと思い、プログラムを組んでいたのですが、想定していた挙動が自力では実現できなかったため、質問させていただきます。
ちなみに実現しようとしていたものは、派生クラスで+=
演算子をオーバーロードすると、それに関連する+
演算子を派生クラス側でオーバーロードせずに利用できるというものです。
該当のソースコード
Base.h
cpp
1#pragma once 2 3#include <iostream> 4 5template <typename T> 6class CBase 7{ 8public: 9 CBase() {} 10 ~CBase() {} 11 12 T operator+=(const T& a) { 13 return T(); 14 } 15 T operator+(const T& a) { 16 return *this += a; 17 } 18};
Num.h
cpp
1#pragma once 2 3#include "Base.h" 4 5class CNum : public CBase<CNum> 6{ 7public: 8 int num_; 9 CNum(); 10 CNum(int n); 11 ~CNum(); 12 13 CNum& operator+=(const CNum& a); 14 15 // 標準出力で表示する時用 16 int ToInt(); 17};
Num.cpp
cpp
1#include "Num.h" 2 3 4CNum::CNum() 5{ 6} 7 8 9CNum::CNum(int n): 10 num_(n) 11{ 12 13} 14 15 16CNum::~CNum() 17{ 18} 19 20 21CNum& CNum::operator+=(const CNum& a) 22{ 23 this->num_ += a.num_; 24 return *this; 25} 26 27 28int CNum::ToInt() 29{ 30 return num_; 31}
main.cpp
cpp
1#include <iostream> 2#include "Num.h" 3 4int main(void) { 5 6 CNum numA(3), numB(5); 7 CNum numR = numA + numB; 8 9 std::cout << numR.ToInt() << std::endl; 10 11 return 0; 12}
試したこと
一応エラーが出ないようになってはいますが、表示される値が -858993460
と明らかにおかしい値になっています。
T operator+=(const T& a)
や T operator+(const T& a)
の部分がおかしいだろうなということは分かります。それぞれの定義の部分で派生クラスのメソッドを呼び出せたら解決しそうではあるのですが、言語仕様的に可能なのかどうか分かりません。
私がやりたいことはこの方法で可能なのでしょうか。また、実際に Boost の Operators はどのような処理をしているのか知っている人がいましたら、教えて頂けると幸いです。
補足情報(FW/ツールのバージョンなど)
Visual Studio Community 2019
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。