#include #include using namespace boost::math; template class Wrapper : boost::field_operators > { public: Wrapper(const T& w = T()) : v_(w) { } Wrapper& operator+=(const Wrapper& w) { v_ += w.v_; return *this; } Wrapper operator+() const { return Wrapper(+v_); } Wrapper& operator-=(const Wrapper& w) { v_ -= w.v_; return *this; } Wrapper operator-() { return Wrapper(-v_); } Wrapper& operator*=(const Wrapper& w) { v_ *= w.v_; return *this; } Wrapper& operator/=(const Wrapper& w) { v_ /= w.v_; return *this; } private: T v_; }; typedef Wrapper wr; typedef quaternion quat1; typedef Wrapper wrr; typedef quaternion quat2; int main(int argc, const char *argv[]) { // This works quat1 q1(wr(1), wr(2), wr(3), wr(4)); pow(q1, 4); // This does not quat2 q2(wrr(3), wrr(4), wrr(5), wrr(6)); //pow(q2, 4); return 0; }