typedefで宣言した構造体で演算子オーバーロードを定義したらビルドエラーとなったので、その原因と対策を自分用の備忘録として残します。
以下の様に演算子のオーバーロードを定義しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <stdio.h> #include <iostream> typedef struct { int value; bool operator==(const Test& test) { return value == test.value; } } Test; int main() { Test test = { 0 }; Test test2 = { 1 }; if (test == test2) { std::cout << "構造体の値は等しいです。"; } else { std::cout << "構造体の値は等しくないです。"; } } |
ビルド結果は・・・
typedef 名で使用されている名前のないクラスでは、静的でないデータ メンバー、メンバーの列挙値、メンバー クラス以外のメンバーを宣言できません
はい。エラーです。
久しぶりにC++を触ったので、typedefの仕様をすっかり忘れていましたorz
エラーメッセージを調べると、以下の様に記載されています。
宣言内の名前のないクラスはtypedef、以外のメンバーを持つことはできません。
https://docs.microsoft.com/ja-jp/cpp/error-messages/compiler-warnings/c5208?view=msvc-170
・既定のメンバー初期化子を持たない非静的データメンバー、
・メンバークラス、または
・メンバー列挙型。
翻訳が少しバグっていますが、雑に言うと名前の無い構造体にメンバ関数は定義できませんという事みたいです。
名前の分からない型に関数を定義しても解決できないので当然と言えば当然ですが・・・。
なので、以下の様に構造体に名前を付けてあげれば解決します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <stdio.h> #include <iostream> typedef struct Test { int value; bool operator==(const Test& test) { return value == test.value; } }; int main() { Test test = { 0 }; Test test2 = { 1 }; if (test == test2) { std::cout << "構造体の値は等しいです。"; } else { std::cout << "構造体の値は等しくないです。"; } } |
VisualStudioだと分かりやすいビルドエラーを出してくれますが、ごりへいの開発環境はC++Builderのかなり古いバージョンで、「”)”が足りません」みたいな謎のビルドエラーが出ました^^;
おかげさまで原因がよくわからなくて20分位時間を無駄にしてしまいました。
「C++ typedef struct operator エラー」なんて調べても解決方法が出てこなかったので、記事にしてみました。
(基本的な事過ぎて出てこなかったのかもしれませんがlol)
コメント