Nightmare1
@Nightmare1
Программист

Может ли метати стать типом объявлемого уникального указател в шаблоне интерфейса при реализации интерфейса в конечном классе?

template <typename T>
class ITest {
public:
  std::unique_ptr<T> mPtr1;
};

class Real : public ITest<Real>
{
public:
// gots error.
}


Возникает ошибка. Почему так и возможна ли такая запись каким либо другим спообом?
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 2
sheerluck
@sheerluck
У меня никакой ошибки на "-std=c++20" и "-std=c++23"
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вот поэтому надо приводить текст ошибки целиком. То, как вы попытались упростить код, ошибки никакой не содержит. Код из вопроса компилируется отлично.

Ошибка C2989 "класс шаблон уже объявлен как не класс шаблон" означает, внезапно, что класс-шаблон уже объявлен где-то как не шаблон. Имя класса в ошибке тоже присутствует: "Машинный::Интерфейсы::ИСистемаОбменаСообщениями"

Итак, вы заводите шаблон ИСистемаОбменаСообщениями. Но где-то еще в этом же модуле трансляции (смотрите всякие включенные хедеры тоже) уже есть ИСистемаОбменаСообщениями - только объявленная как класс.

Ищите по исходникам все места, где ИСистемаОбменаСообщениями встречается и смотрите. Может у вас где-то forward declaration есть неправильное (вроде class ИСистемаОбменаСообщениями; вместо template <...> class ИСистемаОбменаСообщениями;). Или класс с таким же названием.

Еще очень помогает читать, что компилятор вам пишет, а не пытаться угадывать, что же не так с классом, на который он ругается. Можно гуглить код ошибки - тогда можно найти кучу примеров и объяснений.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы