初めて質問します。
私現在、UnixのプログラムをWinのVC++6.0に移植しようと奮闘しております。
が、何ゆえC++を始めたばかりで、悩みの毎日です。
コンパイルすると下記の部分でエラーが起こってしまいます。
-----------------------------------------
1 : template<class T> class Mycls3 : public Mycls2<T>{
2 : public:
3 : Mycls3(){}
4 : Mycls3(unsigned int width, unsigned int height)
5 : :Mycls2(width, height){}
以下省略
の5行目で「'Mycls2': クラスのテンプレート名で仮引数リストの指定がありません」
と言うエラーが出てしまいます。
1、これは一体どういうことなのでしょうか?
なぜ、このようなエラーがでて、どう対処すればよいのでしょうか。
2、4行目から5行目にかけての:Mycls2以下は一体何を意味するのでしょうか?
私には関数をオーバーロードして継承しているように見えるのですが、実際は
どういう役割をしているのでしょうか?
分かり難い質問かも知れませんが、質問がわかりにくければ、
自分なりの方法で説明いたします。ご教授の程をよろしくお願い致します。
>1、これは一体どういうことなのでしょうか?
私の環境(Win2K+SP5,VC++6.0+SP2)ではエラーは発生しません。
但し 下記コードを自作した状態での事です。
template<class T>class Mycls2{
T m_width,
m_height;
public:
Mycls2(){}
Mycls2( T width, T height ){ m_width = width; m_height = height; }
};
void f( void ){ Mycls3< int > a; }
>実際はどういう役割をしているのでしょうか?
Mycls2::Mycls2( unsigned int, unsigned int )
(又は 暗黙の型変換により型が合うコンストラクタ )
を呼んでいます。
追伸:移植作業以前に、C++の文法を把握すべきです。
Cを分かっていれば、座学だけでも1ヶ月以内で済むと思います。
くたくたさん、ご教授ありがとうございます。
自分の勉強不足を痛感しており、現在勉強をしております。
勉強不足をさらけ出すようで恥ずかしくも、お聞きしたいのですが
4 : Mycls3(unsigned int width, unsigned int height)
5 : :Mycls2(width, height){}
で、「:」が一つしかないというのは、どういう事なのでしょうか?
これも継承の一種なのでしょうか?
:Mycls2(width, height){}
の役割が今ひとつ分かりません。
C++に関する本も読んではいるのですが「:」が一つしかないものというのは、
今だ例が発見できません。
くたくたさんを始め、回答をしていただける方々には大変お手数をお掛けして
申し訳ありませんが、ぜひヒントをいただきたく存じます。
よろしくお願いします。
>これも継承の一種なのでしょうか?
違います。コンストラクタ初期化子、Constructor Initializer
をキーワードに調べてみて下さい。
>C++に関する本も読んではいるのですが「:」が一つしかないものというのは、
>今だ例が発見できません。
o その本はC++の文法書ですか?(例えば、C++入門等のタイトルになってる)
雑誌の特集程度のあっさりした物ではないですよね。
o その本を最後まで熟読されましたでしょうか?
完全に読んだのに載ってないのなら問題があります。
他の文法書に切り替えるべきだと思います。
o 発見できなかったら、発見できる本を探すのが筋です。
真剣に探せば 必ず見つかります。
asagiさん、こんにちは。
「:」はクラス内のメンバオブジェクトを初期化したかったり、基本クラスのオブジェクトを
初期化したいときに使います。
Mycls3(unsigned int width, unsigned int height)
:Mycls2(width, height){}
これで、Mycls3のコンストラクタで、Mycls2のコンストラクタを呼ぶ、というという意味。
template<class T> class Mycls3 : public Mycls2<T>{
において、Mycls2はテンプレートパラメータTを用いて実体化される。
Mycls2の内容がどうなっているかはわからないが、
Mycls3(unsigned int width, unsigned int height)
:Mycls2(width, height){}
を成り立たせるためにはMycls2にunsigned intを二つ取るコンストラクタが必要である。
'Mycls2': クラスのテンプレート名で仮引数リストの指定がありません
というエラーが出るということは、
Mycls2コンストラクタがテンプレートになっていることが予想される。
くたくたさん、はまちさん、PAIさんご回答ありがとうございます。
Mycls3(unsigned int width, unsigned int height)
:Mycls2<T>(width, height){}
とテンプレート指定することで解決いたしました。
コンストラクタ初期化子の説明については、自分の持っている本ではやはり見つけられず、
検索エンジンで解説を見つけました。
くたくたさん > o その本はC++の文法書ですか?(例えば、C++入門等のタイトルになってる)
くたくたさん > 雑誌の特集程度のあっさりした物ではないですよね。
独○ C++改訂版 初版第5刷 (有名な本だと思います。)
[本名を出してよいものか分からないので○を使いました]
を読んでおります。
以後もう数冊買って、参考書としたいと思います。
ご教授ありがとうございました。
>独○ C++改訂版 初版第5刷 (有名な本だと思います。)
は載ってないのですか。ビックリしました。僕自身は読んだことがないのですが、よく、話に
聞く本なので、いつの日か読んでみようかと思っていましたが。驚きました。