C++ C++;-使用模板嵌套类初始化引用无效
我们有两个模板类,C++ C++;-使用模板嵌套类初始化引用无效,c++,templates,reference,inner-classes,C++,Templates,Reference,Inner Classes,我们有两个模板类,Class1有一个嵌套类类2需要从该嵌套类对象构造/转换 template<typename T> struct Class1{ Class1() = default; class Inner{}; }; template<typename T> struct Class2{ Class2() = default; template<typename T2> Class2(const Class1&l
Class1
有一个嵌套类<代码>类2需要从该嵌套类对象构造/转换
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
模板结构类1{
Class1()=默认值;
类内部{};
};
模板结构类2{
Class2()=默认值;
模板类2(常量类1&){}
模板类2(constTypeName类1::internal&){}
};
void foo(const Class2&){}
...
1类c1;
类别1:内部i1;
foo(c1);
foo(i1);// 第二个构造函数(采用内部
的构造函数)无法调用。由于模板参数T2
出现在非推断上下文中,位于命名从属类型的范围解析运算符的左侧,因此必须显式指定它
但是不能显式提供模板化构造函数的模板参数!必须对其进行推断
因此,第二个c'tor的替换总是失败的。只有第一个c'tor能够超负荷解决问题。重载解析会看到您试图将Class2::Inner
对象绑定到const Class2&
。该引用无法绑定。谢谢!我试图理解“非演绎语境”的概念。在这种情况下,编译器知道i1
实际上是Class1::internal
,那么为什么它不能调用正确的构造函数呢?在任何情况下,都没有办法实现我想要的吗?@AdyAdy-编译器不能依赖这些信息。你可以。在那个例子中,他们将函数调用为g(double{})
。我认为这是不同的,因为我不能调用foo(内部{})
。内部总是来自Class1
。我不是想争论,只是想了解这是怎么回事。@AdyAdy-这是肤浅的。需要注意的是,专业化的可能性意味着::internal
可能不是人们所期望的。因此编译器可能无法推断T2
。我知道这是违反直觉的。但是暂时忘记你的主模板。设想一个恶意用户编写模板结构类{typedef void internal;}代码>。该语言允许用户这样做。因此编译器无法从内部
推断出任何东西。
error: invalid initialization of reference of type ???const Class2<int>&??? from expression of type ???Class1<int>::Inner???