In the following code:
class Class {
};
class Subclass : public Class {
};
template<typename T>
class Template1 {
public:
};
template<typename T>
class Template2 {
public:
template<typename Y>
Template2(const Template1<Y>& t1)
{
}
};
Template2<Class> f1(Template2<Class>& t2) {
return Template1<Subclass>();
}
Template2<Class> f2(Template2<Class> t2) {
return Template1<Subclass>();
}
int main() {
f1(Template1<Subclass>()); // error C2664: 'Template2<Class> f1(Template2<Class> &)': cannot convert argument 1 from 'Template1<Subclass>' to 'Template2<Class> &'
f2(Template1<Subclass>()); // OK
f1(Template2<Class>(Template1<Subclass>())); // OK
}
If I remove the reference from the function or do the conversion myself everything's fine, but the compiler doesn't seem to want to convert from Template1
to Template2&
on its own. Why?