class Base; class Hasei1 : public Base; class Hasei2 : public Base; とありまして, 使う側は"base.h"だけ知っていれば問題無いですよね。 ところが,ファイルに保存した情報からnewしようとすると 具体的な"hasei1.h"や"hasei2.h"が必要になってしまいます。 これはなんとかならないものでしょうか? 意味不明ならスマソ
int main() { std::auto_ptr<D> bp6(std::auto_ptr<B>()); //bp6.reset(); return 0; } gcc(3.2.2,2.9.5とも)でこれをコンパイルすると通る上に、//の 部分のコメントを外すと hoge.cc: In function `int main()': hoge.cc:8: request for member `reset' in `p', which is of non-aggregate type `auto_ptr<D> ()(auto_ptr<B> (*)())' とか言われるんだけど、これってバグだよね? ちなみに std::auto_ptr<D> bp6(std::auto_ptr<B>(0)); だと予想通りの挙動になる。
Tが型名だとすると、 T a(T()); は、 「『引数を取らずT型の値を返す関数』型の引数を一つ受け取りT型の値を返す関数」の宣言と読める。 しかし同時に、「T()を初期化子とするT型の変数」の宣言にも見える。 これらは実際曖昧で、曖昧さを解決するための鍵は、T()を式とするか、宣言とするかである。
んで、[6.8 -1-]。 〜引用〜 An expression-statement with a function-style explicit type conversion as its leftmost subexpression can be indistinguishable from a declaration where the first declarator starts with a (. In those cases the statement is a declaration. 〜引用おしまい〜 〜引用訳〜 関数スタイルの明示的型変換を最も左の式とする式文は、 最初の宣言子が「(」で始まる宣言と区別できない。 そのような場合、その文は宣言である。 〜引用訳おしまい〜