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

时间:2018-10-27 14:32:52

标签: c++ templates reference inner-classes

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

1 个答案:

答案 0 :(得分:1)

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

但是无法显式提供模板构造函数的模板参数!必须推论它们。

因此,第二个替代总是会失败。只有第一个控制器才能使它超载分辨率。并且该重载解决方案表明您尝试将Class2<int>::Inner对象绑定到const Class2<int>&。该引用根本无法绑定。