The segmentation fault is a bug in your code, not in gcc. A temporary is getting constructed, and you are using the compiler generated assignment operator, so you get two instances deallocating the same memory. Try adding a private operator=
class ScalarVector : public Vector<ScalarVector> { private: ScalarVector& operator=(const ScalarVector&); }; and your code will fail to compile. Provide a suitable public operator= and your code should work. I believe the other problem can be simplified to struct A { double operator*(double); }; template<typename T> T operator*(double, T); int main() { A a; a * 3.0; } which gives the error z2.cc: In function `int main()': z2.cc:5: `T operator*(double, const T&) [with T = double]' must have an argument of class or enumerated type -- Philip -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]