Перейти к содержанию
Посмотреть в приложении

A better way to browse. Learn more.

Форум Академгородка, Новосибирск

A full-screen app on your home screen with push notifications, badges and more.

Чтобы установить это приложение на iOS и iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
Чтобы установить это приложение на Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Наследование от шаблонного класса

Опубликовано

Подскажите, пожалуйста, я что-то делаю не так, или гнусный компилятор шалит?

 

template<typename T>
class Test {
public:
char * test_field;
};

template<typename T>
class Test1:public Test<T> {
public:
Test1() {
	test_field=0;
}
};
Test1<int> x;

 

Дает при попытке собрать в GCC (g++) :

 

test.cc: In constructor 'Test1<T>::Test1()':
test.cc:11: error: 'test_field' was not declared in this scope

 

Следующие два варианта собираются без проблем:

template<typename T>
class Test {
public:
char * test_field;
};

class Test1:public Test<int> {
public:
Test1() {
	test_field=0;
}
};
Test1 x;

(У потомка убрана шаблонность)

template<typename T>
class Test {
public:
char * test_field;
};

template<typename T>
class Test1:public Test<T> {
public:
Test1() {
	this->test_field=0;
}
};
Test1<int> x;

(Обращаемся к полю базового класса через оператор-селектор)

 

Рекомендуемые сообщения

Опубликовано

Не только гнусь, но ещё и Comeau C/C++ Online "шалит":

Comeau C/C++ 4.3.9 (Mar 27 2007 17:24:47) for ONLINE_EVALUATION_BETA1
Copyright 1988-2007 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 9: error: identifier "test_field" is undefined
      test_field = 0;
      ^

1 error detected in the compilation of "ComeauTest.c".

Связаны эти "шалости", если мне не изменяет склероз, с поправками в стандарте С++2003.

На вскидку статью не скажу, но идея в том, что до инстанцирования состав неявно зависимых имён не определён.

Т.е. если ты перед строкой Test1<int> x; добавишь объявление test_field, то компилятор будет в непонятках, какое объявление нужно использовать.

 

А в MSVC такие ситуации обрабатываются традиционно неправильно. :-)

Я как-то попытался ихнюю GRETA под гнусью завести - так и не смог из за таких вот неявных зависимостей.

Опубликовано

просто нужно явно указать неймспейс базового класса при обращении к атрибуту предка

 

template<typename T>
class Test {
public:
char * test_field;
};

template<typename T>
class Test1:public Test<T> {
public:
Test1() {
	Test<T> :: test_field=0;
}
};
Test1<int> x;

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

Аккаунт

Навигация

Поиск

Поиск

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.