多重定義なのでしょうか継承なのでしょうか

[戻る]
asagi 2002/05/25(土) 17:32:43
初めて質問します。
私現在、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以下は一体何を意味するのでしょうか?
  私には関数をオーバーロードして継承しているように見えるのですが、実際は
  どういう役割をしているのでしょうか?

分かり難い質問かも知れませんが、質問がわかりにくければ、
自分なりの方法で説明いたします。ご教授の程をよろしくお願い致します。

くたくた 2002/05/25(土) 21:09:30
>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ヶ月以内で済むと思います。

asagi 2002/05/25(土) 22:24:19
くたくたさん、ご教授ありがとうございます。

自分の勉強不足を痛感しており、現在勉強をしております。
勉強不足をさらけ出すようで恥ずかしくも、お聞きしたいのですが
4 :   Mycls3(unsigned int width, unsigned int height)
5 :    :Mycls2(width, height){} 
で、「:」が一つしかないというのは、どういう事なのでしょうか?
これも継承の一種なのでしょうか?
:Mycls2(width, height){}
の役割が今ひとつ分かりません。
C++に関する本も読んではいるのですが「:」が一つしかないものというのは、
今だ例が発見できません。

くたくたさんを始め、回答をしていただける方々には大変お手数をお掛けして
申し訳ありませんが、ぜひヒントをいただきたく存じます。
よろしくお願いします。

くたくた 2002/05/25(土) 23:34:20
>これも継承の一種なのでしょうか?
違います。コンストラクタ初期化子、Constructor Initializer
をキーワードに調べてみて下さい。

>C++に関する本も読んではいるのですが「:」が一つしかないものというのは、
>今だ例が発見できません。
o その本はC++の文法書ですか?(例えば、"C++入門"等のタイトルになってる)
  雑誌の特集程度のあっさりした物ではないですよね。

o その本を最後まで熟読されましたでしょうか?
  完全に読んだのに載ってないのなら問題があります。
  他の文法書に切り替えるべきだと思います。

o 発見できなかったら、発見できる本を探すのが筋です。
  真剣に探せば 必ず見つかります。

はまち 2002/05/26(日) 10:46:30
asagiさん、こんにちは。

「:」はクラス内のメンバオブジェクトを初期化したかったり、基本クラスのオブジェクトを
初期化したいときに使います。

PAI 2002/05/26(日) 15:55:10
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コンストラクタがテンプレートになっていることが予想される。

asagi 2002/05/27(月) 17:29:03
[[解決]]
くたくたさん、はまちさん、PAIさんご回答ありがとうございます。

Mycls3(unsigned int width, unsigned int height)
    :Mycls2<T>(width, height){} 

とテンプレート指定することで解決いたしました。

コンストラクタ初期化子の説明については、自分の持っている本ではやはり見つけられず、
検索エンジンで解説を見つけました。

くたくたさん > o その本はC++の文法書ですか?(例えば、"C++入門"等のタイトルになってる)
くたくたさん >   雑誌の特集程度のあっさりした物ではないですよね。

独○ C++改訂版 初版第5刷 (有名な本だと思います。)
[本名を出してよいものか分からないので○を使いました]
を読んでおります。

以後もう数冊買って、参考書としたいと思います。
ご教授ありがとうございました。

はまち 2002/05/27(月) 19:17:43
>独○ C++改訂版 初版第5刷 (有名な本だと思います。)

は載ってないのですか。ビックリしました。僕自身は読んだことがないのですが、よく、話に
聞く本なので、いつの日か読んでみようかと思っていましたが。驚きました。

古いスレッドには追加発言できません。