C++-模板嵌套类的引用初始化无效
C++ - Invalid initialization of reference with template nested class
我们有两个模板类,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>&
。该引用根本无法绑定。
相关文章:
- C++-模板嵌套类的引用初始化无效
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 类型为"短整型 (&)"的引用初始化无效
- 引用初始化和常量表达式
- 在Visual Studio 2013中为rvalue引用初始化捕获
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- Visual C++ 2015 中右值的非常量引用初始化无效
- 是否可以使用对派生类实例的基类引用初始化派生类引用
- 类型'int&'的引用初始化无效,传递参数 1 时出错
- 引用初始化表单
- 从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效
- 简单的C++日志记录类-ostream引用初始化
- 错误:类型为"cv::Mat&"的非常量引用初始化无效
- 为什么我收到类型为"const vec&"的引用初始化无效
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用
- 为什么这会发送一个关于引用初始化无效的错误
- 为什么此处不对引用初始化执行复制初始化?
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖