Squeak.ru - шаблоны программирования

С++ внук не видит данные абстрактного дедушки и бабушки

Следующий код C++ не компилируется:

class Val
{
protected:
    int n;
public:
    Val() : n(0) {}
    Val(int nn) : n(nn) {}

    virtual int blah() const = 0;
};

template <class T>
class subVal : public Val
{
public:
    subVal() : Val() {}

    int blah() const { return n; }
};

template <class T>
class subsubVal : public subVal<T>
{
public:
    subsubVal() : subVal<T>() {}

    int blah() const { return n; } // this is the "faulty" line

    int blahblah() const { return n; }
};



subsubVal<int> ssv;   // declare an instance, to confirm that it can be done

Компилятор (VisualStudio) говорит C2065 'n' необъявленный идентификатор.

Если я заменю строку, отмеченную ошибкой, на

int blah() const { return Val::n; } // replacement line

тогда компилируется нормально.

Неудача, я думаю, связана с тем, что Val здесь является абстрактным классом, поскольку еще один способ добиться успешной компиляции — это закомментировать объявление чистой виртуальной функции blah() в классе Val. Обратите внимание, что дочерний метод blahblah() не вызывает ошибки компиляции. Я также думаю, что это как-то связано с шаблонами, в том смысле, что код компилируется, если удалить шаблоны (но, конечно, я хочу использовать шаблоны в полном проекте; это просто фрагмент для иллюстрации). Обратите также внимание, что у дочернего элемента нет проблем с просмотром значения данных n в родительском элементе. Просто внук не видит этого без посторонней помощи.

Я надеюсь сначала на ответ, который проясняет логику (поскольку мой код, который не скомпилировался, кажется мне логичным), а затем на решение лучше, чем вставлять множество ужасных идентификаторов «Имя класса::» по всему коду внука. (На практике эти идентификаторы будут иметь более длинные имена и сильно снизят естественность и читабельность кода).


  • Объем зависимой базы не учитывается при поиске неполного имени. Вот почему, когда вы его квалифицируете, он работает. 26.03.2021
  • @ArmenTsirunyan большое спасибо. Дальнейший комментарий (теперь удаленный) тоже был очень полезен, потому что он познакомил меня с использованием Val::n как части определения класса внука. 26.03.2021
  • После того, как вопрос был закрыт как дубликат, я обнаружил, что ответ songyuanyao на следующий вопрос был актуальным и полезным: stackoverflow.com/questions/1120833/ 26.03.2021

Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...