Наследование и шаблоны в C++ - почему наследованные участники невидимы?

Никакой

Стиль программирования абсолютно не важен. То, что имеет значение, пригодность для обслуживания и удобочитаемость.

Для обеспечения Вы останетесь на ходу, необходимо осуществить команду с гомогенный и читаемый формат кода . Какой не имеет значения: Вы не можете понравиться никому и существует программное обеспечение для изменения формата кода.

, Если язык принимает несколько парадигм , не пытайтесь выбрать только один. Пока код хорошо прокомментирован и делает задание, кто заботится о нем, парень использовал функциональное или обязательный стиль?

22
задан rubenvb 27 November 2018 в 16:11
поделиться

5 ответов

Это часть правил, касающихся зависимых имен. Method1 не является зависимым именем в области Method2 . Таким образом, компилятор не ищет его в зависимых базовых классах.

Есть два способа исправить это: использовать this или указать базовый тип. Более подробная информация о недавнем посте или в FAQ по C ++ . Также обратите внимание, что вы пропустили ключевое слово public и точку с запятой. Вот фиксированная версия вашего кода.


template <int a>
class Test {
public:
    Test() {}
    int MyMethod1() { return a; }
};

template <int b>
class Another : public Test<b>
{
public:
    Another() {}
    void MyMethod2() {
        Test<b>::MyMethod1();
    }
};

int main()
{
    Another<5> a;
    a.MyMethod1();
    a.MyMethod2();
}

31
ответ дан 29 November 2019 в 04:20
поделиться

Я очистил ваш код до следующего:

template <int a>
class Test {
public:
    Test() {}
    int MyMethod1() { return a; }
};

template <int b>
class Another : public Test<b>
{
public:
    Another() {}
    void MyMethod2() {
        MyMethod1();
    }
};


int main()
{
    Another<5> a;
    a.MyMethod1();
    a.MyMethod2();
}

И скомпилировал с -fpermissive без проблем (вы, вероятно, сможете решить эту проблему).

1
ответ дан 29 November 2019 в 04:20
поделиться

Я думаю, вам просто не хватает публики: в верхней части Другого определения. Для подобных вопросов обычно полезно публиковать сообщения об ошибках, которые вы получаете.

0
ответ дан 29 November 2019 в 04:20
поделиться

Вы должны полностью квалифицировать MyMethod1 . Стандарт C ++ четко заявляет об этом в 14.6.2 / 3:

В определении шаблона класса или члена шаблона класса, если базовый класс шаблона класса зависит от параметра-шаблона, область действия базового класса будет не проверяется во время неквалифицированного поиска имени либо в момент определения шаблона или члена класса, либо во время создания экземпляра шаблона или члена класса.

Итак, вы должны написать:

void MyMethod2() {
    Test<b>::MyMethod1();
}
14
ответ дан 29 November 2019 в 04:20
поделиться

main требуется тип возвращаемого значения.

class Другой нужен завершающая точка с запятой.

class Другой требует, чтобы его члены были общедоступными.

Кроме того, методы обычно не считаются невидимыми; методы были недоступны без ключевого слова public access.

2
ответ дан 29 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: