
AMDG Peng Yu wrote:
main.cc: In instantiation of 'A::multiply_traits<A::X<int>, int>::nested': main.cc:32: instantiated from 'A::multiply_traits<A::X<int>, int>' main.cc:65: instantiated from here main.cc:31: error: no match for 'operator*' in 'A::make [with T = A::X<int>]() * A::make [with T = int]()' main.cc: In function 'int main()': main.cc:65: error: no match for 'operator*' in 'x * 3' main.cc:66: error: no match for 'operator*' in 'A::X<int>() * 0' main.cc:66: error: no match for 'operator*' in 'y * 5' make: *** [main-g.o] Error 1
template<class T1, class T2> struct multiply_traits { BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, make<T1>() * make<T2>()) typedef typename nested::type type; };
template <typename T1, typename T2> typename multiply_traits<X<T1>, T2>::result_type operator*(const X<T1> &x, const T2 &t) { return X<T1>(x.the_t() * t); }
}
Note that the operator* deduces it's return type from multiply_traits, and multiply_traits in turn uses the result of operator*. You need to either specialize multiply_traits for X. (The specialization you #if'ed out should work fine). Or you can change operator*: template<class T1, class T2> X<T1> operator*(const X<T1> &x, const T2 &t); Also, I made a mistake, multiply_traits should say typedef typedef nested::type result_type; instead of typedef ... type;. In Christ, Steven Watanabe