C ++ - Неверная инициализация ссылки с вложенным классом шаблона - PullRequest
0 голосов
/ 27 октября 2018

У нас есть два шаблонных класса, 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 голосов
/ 27 октября 2018

Невозможно вызвать второй конструктор (тот, который принимает Inner). Так как параметр шаблона T2 отображается в не выводимом контексте, слева от оператора разрешения области, который называет зависимый тип, он должен быть указан явно.

Но аргументы шаблона шаблонного конструктора не могут быть предоставлены явно ! Они должны быть выведены.

Как таковая, замена всегда не выполняется для второго c'or. Только первый c'tor делает это, чтобы перегрузить разрешение. И это разрешение перегрузки видит, что вы пытаетесь связать объект Class2<int>::Inner с const Class2<int>&. Эта ссылка просто не может связать.

...