Re: templates and inheritance
er wrote:
i have
class Impl; //abstract
class Impl_A:public Impl{...};//abstract
class Impl_B:public Impl{...};//abstract
class Impl_A_0: public Impl_A{/* implements */};
class S{ public: S(Impl*,...); ...};
class S_A: public S{ public: S_A(Impl_A* impl,...):S(impl){};
class S_B: public S{ public: S_B(Impl_B* impl,...):S(impl){};
//hierarchy ends here
template<typename T,typename U>
std::vector<U> mult(T* pimpl){
//calls U(pimpl,...);
};
a) std::vector<S_A> vec(mult<Impl_A0*,S_A>(Impl_A0*)); //ok
OK -- what? 'vec' is a declaration of a function here, methinks.
b) std::vector<S_A> vec(mult(Impl_A0*)); //compiler error: no
matching function
i would have thought that T and U are implicitly specified by the
input and return type, respectively, so that b) would work?
'vec' has overloaded constructors. How should the compiler know
that you intend to use the copy constructor? Yes, if it knew that
the intended specialisation of 'mult' returns a 'vec<S_A>', then
it might figure out that the copy c-tor is needed. But to know
what 'mult' to specialise (and how), it needs to know what your
'vec' constructor accepts as the argument. The classic catch-22.
Overloading like this does not work because i loose information about
the leaf class (Impl_A0* in example):
std::vector<S_A> mult_A(Impl_A* pimpl){return mult(pimpl);}
std::vector<S_B> mult_A(Impl_B* pimpl){return mult(pimpl);}
any suggestion?
What exactly are you trying to accomplish?
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask