🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1113閲覧

ネストしたクラスのオーバーロード演算子を作成できない

jbe00214

総合スコア63

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2020/12/17 20:10

前提・実現したいこと

ネストしたクラス内の加算演算子を作成したいのですが,うまくいきません。
作成したコードは以下のとおりです。mainのa+bの部分でエラーがでます。
どなたか,お分かりになる方のご教示お願いいたします。

発生している問題・エラーメッセージ

Invalid operands to binary expression ('Foo<int>::Boo' and 'Foo<int>::Boo')

該当のソースコード

C++

1template<typename T> 2struct Foo{ 3 struct Boo{ 4 T val; 5 Boo& operator+=(const Boo& r){ 6 val+=r.val; 7 return *this; 8 } 9 }boo; 10}; 11 12template<typename T> 13using Boo_t = typename Foo<T>::Boo; 14template<typename T> 15Boo_t<T> operator+(const Boo_t<T>& a, 16 const Boo_t<T>& b){ 17 Boo_t<T> t=a; 18 t += b; 19 return t; 20} 21 22int main(){ 23 Foo<int>::Boo a; 24 a.val=10; 25 Foo<int>::Boo b; 26 b.val=20; 27 Foo<int>::Boo c = a+b; 28 29 return 0; 30}

補足情報(FW/ツールのバージョンなど)

clang
C++17

fana👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

operator+をメンバー関数にするのはダメなのでしょうか?

cpp

1template<typename T> 2struct Foo{ 3 struct Boo{ 4 T val; 5 Boo& operator+=(const Boo& r){ 6 val+=r.val; 7 return *this; 8 } 9 Boo operator+(const Boo& r) const { 10 return Boo(*this) += r; 11 } 12 }boo; 13};

投稿2020/12/18 12:05

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbe00214

2020/12/18 15:35

これでいいですね。2個の引数を前提に考えていたので,思いつきませんでした。ありがとうございました。
guest

0

正直あまり良くわかっていないのですが、

こういう型と

C++

1template<typename T> 2struct Foo{ 3 struct Boo{T val;}; 4};

こういう関数があったとして

C++

1template<typename T> 2void func(const typename Foo<T>::Boo a){}

こういう特殊化をした場合

C++

1template<> struct Foo<int>{using Boo = int;}; 2template<> struct Foo<double>{using Boo = int;};

C++

1func(1); // func(Foo<int>::Boo) ? func(Foo<double>::Boo) ?

という感じで型が解決できないので::の左にある型変数は推測してくれないようです

投稿2020/12/18 03:19

編集2020/12/18 03:31
ozwk

総合スコア13551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbe00214

2020/12/18 05:37

funcの引数から,特殊化のクラス選択のための推論による名前解決ができないということでは同じなんですね。
guest

0

誤解によるものなので取り消し

エラーメッセージのとおりです。当該の型に+=演算子はオーバーロードされていますが、+はありません。

投稿2020/12/17 23:01

編集2020/12/18 01:32
maisumakun

総合スコア145965

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki23

2020/12/18 01:25

operator+は定義されているのにオーバーロードされてないのはなぜ? という質問ではないでしょうか
maisumakun

2020/12/18 01:33

試しにWandboxへ投げてみたら、「couldn't deduce template parameter 'T'」となりました。ちょっと追いきれていない感じはありますが、とりあえずそこだけメモしておきます。
jbe00214

2020/12/18 01:51

yuki23<< そのようです。operator+で名前解決してくれていないような。 maisumakun<< その後よくエラーを見てみると,operator+のところで,Candidate template ignored: couldn't infer template argument 'T'と,Wandboxと同じようなワーニングが出ていました。推論してくれていないということですね。原因がわかりません。
jbe00214

2020/12/18 04:55

ありがとうございます。この話ですね。ネストしたクラス内のクラスの型まで推論してくれないと。エラーの原因はわかりました。ではどのように実装するか。。。
jbe00214

2020/12/18 05:21

こんな感じでしょうか。 求めていた解決方法ではなく,Booでの演算はできないのが残念です。 ```C++ template<typename T> Foo<T> operator+(const Foo<T>& a, const Foo<T>& b){ Foo<T> t; t.boo = a.boo; t.boo += b.boo; return t; } int main(){ Foo<int>a; a.boo.val=10; Foo<int> b; b.boo.val=20; Foo<int> c = a+b; return 0; } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問