C++-模板嵌套类的引用初始化无效

C++ - Invalid initialization of reference with template nested class

本文关键字:引用 初始化 无效 嵌套 C++-      更新时间:2023-10-16

我们有两个模板类,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构造也可以。

无法调用第二个构造函数(采用Inner的构造函数(。由于模板参数T2出现在非推导上下文中,位于命名依赖类型的作用域解析运算符的左侧,因此必须显式指定它。

但是模板化构造函数的模板参数不能显式提供!它们必须被推导出来。

因此,第二个c'tor的替换总是失败的。只有第一个c'tor才能使分辨率过载。这个重载解析可以看到您试图将Class2<int>::Inner对象绑定到const Class2<int>&。该引用根本无法绑定。