No.1ベストアンサー
- 回答日時:
結論から言ってしまえば、class test に、char * を引数とするコンストラクタがないからです。
「演算子」というくくりでは、普通は継承されます。例えば、
test tmp1;
test tmp2;
に対して、
tmp1 == tmp2 という比較は、文法上有効です。
さて、operator=() は、例外で、ユーザーが明示的に定義しない場合、まず、暗黙の型変換(char * → test)をしようとします。
これは具体的には、test::test(char *) というコンストラクタの呼び出しになります。
が、test::test(char *) が存在しないため、代入もできないというメカニズムのようです。
No.6
- 回答日時:
> SGI STLには含まるんですよね?
確かにバージョン3.1ぐらいからSGIのSTLにもbasic_stringが入っていますね。標準C++に導入されたころのSTLにはまだ入ってなかったはずです(というより、標準C++のものをSTLにバックポートした)。ISO/IEC 14882の中にはSTLとかStandard Template Libraryという言葉は出てこないので、単にSTLといえばSGIのものを指すと考える方が妥当なのかもしれません。そうであれば、basic_stringはSTLに含まれるという結論になるかと思います。
とはいえ、実際にSGIのSTLを使っている人は率からいうとそんなにないわけですし、普通は標準C++ライブラリの一部と考えるのが妥当ではないでしょうか。
この辺はちょっと微妙ですね。
> std::vectorやstd::listはSTLですよね??
こちらは間違いなくSTLです。
No.5
- 回答日時:
> STLは奥が深い。
。。いや、basic_stringはSTLではありません。
この回答へのお礼
お礼日時:2006/01/20 10:48
ご指摘有り難うございます。
SGI STLには含まるんですよね?
http://www.sgi.com/tech/stl/basic_string.html
std::vectorやstd::listはSTLですよね??
質問内容がそれてしまいましたが、もしよければお答え頂けないでしょうか。
No.4
- 回答日時:
直接の原因は、testクラスに変換コンストラクタまたは代入演算子が定義されていないところにあります。
あと、#3の方の意見とも関連するのですが...
basic_stringはpublic継承には余り適していません。継承で解決するより、テンプレート引数のtraitsやAllocatorを摩り替える方がよいでしょう。振る舞いを変えるのではなく、インタフェースを追加するのであれば、メンバ関数としてより、フリー関数(非メンバ関数)にした方がよいでしょう。
No.3
- 回答日時:
直接の回答ではないのですが……
string を継承するというのがちょっと気になりまして。
ご質問の内容が、単純に興味からであれば別ですが、string を継承する必要があるとお感じだとしたら、それは、設計を間違っているのかも知れません。
(そういうケースが多いのです)
string の継承は、例えば、データをすべて小文字として扱う string とか、数字しか受け付けない string とか、10文字以上は受付けない(適切に処理する) string とか、いずれも、……という string を定義するものです。
こういう用途であれば問題ありません。
よくある間違いは、本来、class のメンバーとして string を持つべきものでも、string を継承させようとするものです。
string を継承すべきなのか、string メンバーを持てばいいのか、そのあたりご検討を。
既に、ご検討済みであれば失礼しました。
参考URL:http://www.cmagazine.jp/src/kinjite/cpp/idea.htm …
No.2
- 回答日時:
operator=は特殊で継承されません。
これを回避するためのテクニックは
string& test::operator=(const char* T)
{
/*test独自のコピー処理をここに記述*/
return string::operator=(T);
}
string& test::operator=(const string& T)
{
/*test独自のコピー処理をここに記述*/
return string::operator=(T);
}
string& test::operator=(const char T)
{
/*test独自のコピー処理をここに記述*/
return string::operator=(T);
}
を宣言することです。
operator=が継承されない理由としては
string::operatorでは
追加されたメンバがコピーされないためです。
なお派生クラスには親クラスのオブジェクトが代入可能なので上のコードは有効です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# このプログラミング誰か教えてください 9 2022/04/22 18:50
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
- Visual Basic(VBA) 【マクロ】フォルダにファイルが1つも無い時に、ファイルがありませんとメッセージを表示する 4 2022/08/28 08:48
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字列が一致する行から...
-
【Java8以降】csvファイルの複...
-
マルチスレッドで同時にFTPアッ...
-
C# JSONについて
-
C#での関数テーブルの作り方
-
C#でプロパティを使わずXMLにデ...
-
C#での関数テーブルの作り方
-
C# 他のアプリケーションから複...
-
C++/CLI 関数がインポートでき...
-
Delphiで改行文字の置換がうま...
-
string→CStringの型変換について
-
C#で型変換
-
Windows10のC++の正規表現に...
-
C言語のポインターに関する警告
-
VBAで配列の計算
-
[JAVA]try 内の変数を外で!?
-
Javaで改行などが出来ないのです。
-
javaで質問です。 文字列2023/2...
-
EXCEL VBA で、0から?1から?
-
変数を動的に利用するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
strcmp関数などでの複数の文字...
-
マルチスレッドで同時にFTPアッ...
-
C#での関数テーブルの作り方
-
特定の文字列が一致する行から...
-
string→CStringの型変換について
-
【Java8以降】csvファイルの複...
-
GDI+ DrawString() で指定範囲...
-
C#でIPアドレスの取得について
-
「指定されたキャストは有効で...
-
C# JSONについて
-
C#で型変換
-
Delphiで改行文字の置換がうま...
-
java HashMapで数値データを取...
-
GridViewで複数のDropDownList...
-
strtokでの空文字への置き換え
-
C++のmap
-
決まった拡張子のファイルだけ...
-
PHPのSHA256変換について
-
jap実行時のTomcatのエラーに困...
おすすめ情報