質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

1回答

762閲覧

テンプレート演算子のオーバーロードは不可能?

asobinin

総合スコア69

C++

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

0グッド

0クリップ

投稿2019/06/25 14:05

以下のテストコードにて、value_の値を受け取るためにはcast()を使用しなければならないとします。
値を受け取るのに毎回関数名を記述するのは面倒なので演算子のオーバーロードの使用すればもっと扱いやすくなると考えたのですが、この記述では2つともコンパイルエラーとなってしまいました。
ただ単に記述の仕方が間違っているのか、それともこういった技術自体が不可能なのか、お教えください。

Cpp

1#include <iostream> 2 3template <class T> 4class test 5{ 6 T value_; 7public: 8 test(const T& value) 9 : value_(value) {} 10 11 T& operator =(const T& value) 12 { 13 value_ = value; 14 return *this; 15 } 16 17 template <class U> 18 U cast() const 19 { 20 return static_cast<U>(value_); 21 } 22 23 // こ↑こ↓ 24 // 関数オブジェクトによるもの 25 template <class U> 26 U operator()() const 27 { 28 return this->cast<U>(value_); 29 } 30 // 型変換演算子によるもの 31 template <class U> 32 operator U const 33 { 34 return this->cast<U>(value_); 35 } 36}; 37 38int main() { 39 using namespace std; 40 test t = 3.14; 41 42 cout << t.cast<int>() << endl; // OK 43 cout << t<int>() << endl; // NG 44 cout << (int)t << endl; // NG 45 46 return 0; 47}

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

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

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

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

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

guest

回答1

0

ベストアンサー

単にいくつかの小さな書き間違いがあるだけですね。

cpp

1#include <iostream> 2 3template <class T> 4class test 5{ 6 T value_; 7public: 8 test(const T& value) 9 : value_(value) {} 10 11 T& operator =(const T& value) 12 { 13 value_ = value; 14 return *this; 15 } 16 17 template <class U> 18 U cast(void) const 19 { 20 return static_cast<U>(value_); 21 } 22 23 // こ↑こ↓ 24 // 関数オブジェクトによるもの 25 template <class U> 26 U operator()() const 27 { 28 return this->cast<U>(value_); 29 } 30 // 型変換演算子によるもの 31 template <class U> 32 operator U(void) const 33 { 34 return this->cast<U>(); 35 } 36}; 37 38int main() { 39 using namespace std; 40 test<double> t = 3.14; 41 42 cout << t.cast<int>() << endl; 43 cout << (int)t << endl; 44 45 return 0; 46} 47

投稿2019/06/25 14:16

SaitoAtsushi

総合スコア5437

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

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

asobinin

2019/06/25 14:35

cast関数に引数が入力されているのはおかしいですね・・・ 型変換演算子にも()が必要だということも見落としておりました。 まだまだ精進せねばなりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問