Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-使用模板嵌套类初始化引用无效_C++_Templates_Reference_Inner Classes - Fatal编程技术网

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???