Никакой
Стиль программирования абсолютно не важен. То, что имеет значение, пригодность для обслуживания и удобочитаемость.
Для обеспечения Вы останетесь на ходу, необходимо осуществить команду с гомогенный и читаемый формат кода . Какой не имеет значения: Вы не можете понравиться никому и существует программное обеспечение для изменения формата кода.
, Если язык принимает несколько парадигм , не пытайтесь выбрать только один. Пока код хорошо прокомментирован и делает задание, кто заботится о нем, парень использовал функциональное или обязательный стиль?
Это часть правил, касающихся зависимых имен. 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();
}
Я очистил ваш код до следующего:
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
без проблем (вы, вероятно, сможете решить эту проблему).
Я думаю, вам просто не хватает публики: в верхней части Другого определения. Для подобных вопросов обычно полезно публиковать сообщения об ошибках, которые вы получаете.
Вы должны полностью квалифицировать MyMethod1
. Стандарт C ++ четко заявляет об этом в 14.6.2 / 3:
В определении шаблона класса или члена шаблона класса, если базовый класс шаблона класса зависит от параметра-шаблона, область действия базового класса будет не проверяется во время неквалифицированного поиска имени либо в момент определения шаблона или члена класса, либо во время создания экземпляра шаблона или члена класса.
Итак, вы должны написать:
void MyMethod2() {
Test<b>::MyMethod1();
}
main требуется тип возвращаемого значения.
class Другой нужен завершающая точка с запятой.
class Другой требует, чтобы его члены были общедоступными.
Кроме того, методы обычно не считаются невидимыми; методы были недоступны без ключевого слова public access.