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

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

我们有两个模板化的 classes,Class1 有一个嵌套的 class。 Class2 需要从那个嵌套的 class 对象构造/转换。

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 构建工程。如果 class 不是模板,则从 Inner 构建也可以。

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

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

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