我们有两个模板化类,Class1
有一个嵌套类。 Class2
需要从该嵌套的类对象构造/转换。
template<typename T> struct Class1{
Class1() = default;
class Inner{};
};
template<typename T> struct Class2{
Class2() = default;
template<typename T2> Class2(const Class1<T2>&) {}
template<typename T2> Class2(const typename Class1<T2>::Inner&) {}
};
void foo(const Class2<int>&){}
...
Class1<int> c1;
Class1<int>::Inner i1;
foo( c1);
foo( i1); // <===================ERROR
错误文字为:
error: invalid initialization of reference of type ???const Class2<int>&??? from expression of type ???Class1<int>::Inner???
为什么会出现此错误?从Class1
进行构造是可行的。如果类不是模板,则从Inner
进行构造也可以。
答案 0 :(得分:1)
无法调用第二个构造函数(一个使用Inner
的构造函数)。由于模板参数T2
出现在非推导上下文中,因此在命名相关类型的作用域解析运算符的左侧,必须显式指定它。
但是无法显式提供模板构造函数的模板参数!必须推论它们。
因此,第二个替代总是会失败。只有第一个控制器才能使它超载分辨率。并且该重载解决方案表明您尝试将Class2<int>::Inner
对象绑定到const Class2<int>&
。该引用根本无法绑定。