プロが教える店舗&オフィスのセキュリティ対策術

VC8.0言語処理系でメンバ関数テンプレートを仮想関数にしたらエラーになりました。
これは、VC8.0言語処理系の対応なのでしょうか? それともC++言語系の仕様なのでしょうか?

今回、メンバ関数の一部にイテレータを使用していまして、その関係で一部の関数がテンプレートになっています。
そして、基底クラスでは実装せず、派生先で実装を強制する純粋仮想関数としたのですが、この処理がコンパイルエラーとなっています。

メンバ関数の参照などを考えたのですが、どうも巧くコンパイルでき無そうです。

この処理が出来ないことは設計段階で把握していなかったので、これが出来ないとすると設計のし直し(テンプレートの廃止など)をしなくてはいけません。
詳しい方がいらっしゃいましたら、お願いします。

A 回答 (2件)

標準C++の言語仕様上許されていません。



N1905
"Working Draft, Standard for Programming Language C++" より:

14.5.2 Member templates
3 A member function template shall not be virtual.
[ Example:
template < class T > struct AA {
 template < class C > virtual void g(C); / / error
 virtual void f (); / / OK
};
—end example ]
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なるほど、言語仕様なのですね。
設計の段階で気付かなかったのが痛いのですが、仕方が無いので言語仕様に違反しないように設計をしなおします。

お礼日時:2006/11/02 19:56

(規格上、実現方法は規定されていませんが)多くの実装で、仮想関数の実現方法として仮想関数テーブルを使っていることを考えれば、基底クラスでテーブルのサイズが決定できないメンバ関数テンプレートの仮想関数化は、不可能であることが分かると思います。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
確かにテンプレート関数は実装後のサイズが不定ですので、仮想化は無理ですね。

お礼日時:2006/11/02 19:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!