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

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

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

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

Q&A

解決済

3回答

479閲覧

C/C++で曖昧なOverrideとエラーが出る

0819Goki

総合スコア24

C++

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

2グッド

0クリップ

投稿2023/02/24 05:38

実現したいこと

operator=(long long n)とoperator=(const char* n)を同時に実装したいのですが、aに0を代入しようとしたときに以下のようなコンパイルエラーが起きてしまいます。
どうやらポインタとlong longが同じ型であると識別されるため(?)だと考えているのですが、何か良い解決方法はありますか。

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

error: ambiguous overload for 'operator=' (operand types are 'T' and 'int') a=0; ^ note: candidate: T T::operator=(long long int) T operator=(long long n){a = n;} ^~~~~~~~ note: candidate: T T::operator=(const char*) T operator=(const char* n){a = n[0];}

該当のソースコード

C++

1class T{ 2public: 3 long long a; 4 T operator=(long long n){a = n;} 5 T operator=(const char* n){a = n[0];} 6}; 7 8int main(int argc, char *argv[]) { 9 T a=0; 10 T a=1; 11 return 0; 12}
dameo, SaitoAtsushi👍を押しています

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

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

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

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

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

int32_t

2023/02/24 05:57

タイトルで override と書いてますが、overload です。
dameo

2023/02/24 06:33

CとC++は実際には別の言語です。最近多いのですが、C++にしか関係ないのにC/C++と記述するのはやめましょう(タイトルのことです)。 #define NULL 0 についての歴史的経緯についてはよく知りません。nullptrがあっても結局この手の問題は残っているんですね。
guest

回答3

0

整数定数 (定数式) のゼロは暗黙にポインタに変換可能というルールがあるので long long へも const char* へも変換可能ですが、これはどちらが優先であるか決められないケースなので曖昧ということになってしまいます。

通常のオーバーロード解決ルールで思ったように解決されない場合は関数テンプレートで受け取ってから振り分けるというテクニックが知られています。 (標準ライブラリの中では数学系関数で使われています。)

cpp

1#include <type_traits> 2 3class T { 4 public: 5 long long a; 6 template <class U> 7 typename std::enable_if<std::is_arithmetic<U>::value, T>::type& operator=(U x) { 8 return *this = static_cast<long long>(x); 9 } 10 T& operator=(long long n) { 11 a = n; 12 return *this; 13 } 14 T& operator=(const char* n) { 15 a = n[0]; 16 return *this; 17 } 18}; 19 20int main(int argc, char* argv[]) { 21 T a; 22 a = 0; 23 return 0; 24}

投稿2023/02/24 10:39

SaitoAtsushi

総合スコア5515

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

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

0

ベストアンサー

int のも足しましょう。
0int 型ですが、long long にも const char* にも変換できるため曖昧と言われています。

c++

1 T operator=(int n){ a = n; return *this; }

投稿2023/02/24 05:54

編集2023/02/24 05:59
int32_t

総合スコア21207

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

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

0

operator = を書いただけでは T a=0; みたく初期化はできないんじゃないかと思うのですが.

実際は「代入」でエラーが出ているのだとしたら,

C++

1T a; 2a = 0LL; //右辺は long long

とかして,型を明確に指定すればよいでしょう.

投稿2023/02/24 06:05

fana

総合スコア11729

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問