多重定義なのでしょうか継承なのでしょうか – プログラミング – Home

多重定義なのでしょうか継承なのでしょう...
 
通知
すべてクリア

[解決済] 多重定義なのでしょうか継承なのでしょうか


asagi
 asagi
(@asagi)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

初めて質問します。
私現在、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以下は一体何を意味するのでしょうか?
  私には関数をオーバーロードして継承しているように見えるのですが、実際は
  どういう役割をしているのでしょうか?

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


引用未解決
トピックタグ
くたくた
 くたくた
(@くたくた)
ゲスト
結合: 23年前
投稿: 119
 

>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
 asagi
(@asagi)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

くたくたさん、ご教授ありがとうございます。

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

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


返信引用
くたくた
 くたくた
(@くたくた)
ゲスト
結合: 23年前
投稿: 119
 

>これも継承の一種なのでしょうか?
違います。コンストラクタ初期化子、Constructor Initializer
をキーワードに調べてみて下さい。

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

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

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


返信引用
はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
 

asagiさん、こんにちは。

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


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

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
 asagi
(@asagi)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

くたくたさん、はまちさん、PAIさんご回答ありがとうございます。

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

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

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

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

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

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


返信引用
はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
 

>独○ C++改訂版 初版第5刷 (有名な本だと思います。)

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました