complex.C:11: error: syntax error before `&' token complex.C:15: error: syntax error before `&' token complex.C: In function `int main()': complex.C:32: error: no match for 'operator++' in '++purei'
ostream& operator<< (ostream& o, AAA e) { switch (e) { case BBB: o << "BBB"; break; case CCC: o << "CCC"; break; case DDD: o << "DDD"; break; } return o; }
もすこし、具体的に書きます。 A or Bのconstructorにはdoubleを渡し、 他のclass CのconstructorにBを渡すようにしてあります。 で、B b(1.0)とした後に、 C c(b)とするとcompileが通るのですが、 C c(B(1.0))とすると通らないのです。 Cのmember関数を呼び出すところで、 which is ...のerrorが出ます。 もしかしたらこのmember関数が悪さをしているのかも知れませんが、 cの宣言の違いで結果が変わるため、 constructorあたりが悪いのかと想像しました。
■結果■ (実際にはもう少し複雑なclassを扱っていますが、 内容をかなり省略して書きます。) Cというclassのconstructorに、引数としてBを渡した。 C(const B& rb) { b = new B(rb);} ここで、A(or B)のconstructorはA(const double& rval){ val = rval;} という単純なものである。 copy constructorは、A(const A& rA){ val = rA.val;}である。 また、Cのmember関数としてC::func()を用意した。 このとき、main()の中で、 C c(B(1.0)); c.func(); という記述を行うと、二行目で error: request for member `func' in `c(A)', which is of non-aggregate type `C ()(A)' と出る。(あくまで簡略して書いています。) 1行目は何も怒られない。 そこで、c.func();をcomment outして再compileさせると、 compileは通った。(OS Xのg++です。明日、他の環境も試してみます。) ただし、gdbでデバッグしてやると、 この1行目は何故か読み込まれていなかった。 また、先のをさらに書き換えて、 B b(1.0); C c(b); c.func; としてやるとcompileは通り、 動作も期待通りのものであった。
class C { private: B* b; public: C(const B& rB){b = new B(rB);} C(const C& rC){b = new B(*(rC.b));} ~C(){delete b;} C& operator=(const C& rC){delete b; b = new B(*(rC.b));}