この答えが明らかである必要がある場合はお詫びします。おそらくこれには「ドープ割り当てオーバーロード」のようなパターン名があり、適切なトピックで検索されていません-最も歓迎されるコード抽出をリダイレクトします:
class MySet {
private:
int lower;
int upper;
char *data;
public:
MySet( int l, int u, const char *val = 0 );
MySet &operator=( MySet &rhs );
MySet &operator=( const char *val );
};
int main(int i, const char *argv[])
{
MySet A(1,10);
A = "hello";
MySet B(1,10, "hello");
MySet C(1,10) = "hello";
}
A と B の代入は機能しますが、C の場合は g++ 泣き言を言う....: myset.cxx:19:16: エラー: 期待される ',' または ';' 「=」トークンの前
は大きな問題ではありませんが、なぜ無効なのかを理解しようとしています。
役に立つ返信をありがとう。
詳細... 私の操作を編集するためのものだと思いますか?
上記が違法と見なされる理由を突き止めて、決定的な理由を探していました...そしてもちろん、そのような表記法をコンパイラーに受け入れさせるためのトリック.
合法的な同様の使用を検討する
struct toons {
char first[10];
} flintstone[] = {
"fred",
"wilma",
""
};
次のように、数十年の C コンパイラから動作します。
typedef struct {
char family[10];
struct {
char name[10];
} members[6];
} toongroup;
toongroup rubble = {
"rubble",
{
"barney",
"wilma",
""
}
}
toongroup rubble = {
"rubble",
{
"barney",
"wilma",
"", "", "", ""
}
};
toongroup jetsons = { "jetson", { "george", "jane", "", "", "", "" } };
すべて c++ コンパイラによって尊重されます。構造体にメンバー関数を含めることができ、引き続き機能します。
typedef struct toongroup {
public:
bool add( const char *newbaby ) {
for(int i; i<6; i++) {
if(strlen(members[i].name) == 0) {
strcpy(members[i].name, newbaby);
return true;
}
if(strcmp(members[i].name, newbaby) == 0)
return false;
}
return false;
}
char family[10];
struct {
char name[10];
} members[6];
} toongroup;
toongroup jetsons = { "jetson", { "george", "jane", "", "", "", "" } };
jetsons.add( "elroy" );
コンストラクターを追加すると、反対意見が始まります。
typedef struct toongroup {
toongroup( const char *f, const char *m, ... ) {
}
error: in C++98 ‘rubble’ must be initialized by constructor, not by ‘{...}’
error: could not convert ‘{"rubble", {"barney", "wilma", "", "", "", ""}}’ from ‘<brace-enclosed initializer list>’ to ‘toongroup‘
コンパイラーがコンストラクターと一致できるように、適切な初期化子を使用することが問題になるのではないかと考えています
toongroup empty;
toongroup nobody = empty;
toongroup rubble( "rubble", "barney", "wilma", "" );
平
toongroup empty;
toongroup cancelled;
toongroup nobody = empty;
toongroup rubble( "rubble", "barney", "wilma", "" );
toongroup jetsons( "jetson", "george", "jane", "" );
jetsons.add( "elroy" );
追加
toongroup &operator=( toons &t );
許可します
jetsons = cancelled;
だがしかし
toongroup jetsons( "jetson", "george", "jane", "" ) = cancelled;
これが長い投稿になってしまったことをお詫びしますが、コンストラクターと割り当てが拒否される理由と、これに対応できるかどうかについてのアイデアを探しています。
MySet の表記法では、これはおなじみのステートメントになりますが、違法であると宣言する前に、トリックがないかどうかを確認したかったのです。
ありがとう。