Виртуальное наследование, явная реализация — возвращение ссылки / указателя на производный класс (ковариантные типы)

.HPP

template <typename T>
struct A { virtual A& modify() = 0; };

template <typename T>
struct B : virtual A<T> {};

template <typename T>
struct C : B<T> { C& modify() final; };

.CPP

template <typename T>
C<T>& C<T>::modify() {
// …
return *this;
}

// explicit instantiation
template struct C<double>;

Мне нужны некоторые методы для возврата ссылок для создания «цепочек» / определения оператора присваивания / и т.д .:

C<double> a, b, c;
// …
a = (b = c).modify();

Мне также приходится иметь дело с виртуальным наследованием, чтобы избежать «проблемы с бриллиантами» (здесь для простоты опущено).

Однако это не работает:

MSVC:

Error C2908: explicit specialization;
'A<T> &C<T>::modify(void)' has already been instantiated

Явная реализация прекрасно работает без виртуального наследования. Поэтому мне интересно, что здесь не так.
(Также все работает нормально, если нет функций-членов, возвращающих объектные ссылки / указатели.)

0

Решение

Правильный синтаксис для явной реализации должен быть:

template struct C<double>;
^^^^^

Кроме того, вам все равно нужно указать параметр типа для вашего шаблона C:

C<double> a, b, c;
^^^^^^

по крайней мере, G ++ и Clang принимает этот код: http://coliru.stacked-crooked.com/a/23ba6a238a7a17da

но Visual Studio не …


Похоже, что VS не любит ковариантные возвращаемые типы, следующие компилируются в g ++ / clang и VS, но — нет ковариантного возврата в updated (): http://coliru.stacked-crooked.com/a/70c8e64f0824129a

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector