LINUX.ORG.RU

[С++] Наследование с шаблонами

 


0

3

Вот такая конструкция у меня не собирается

template<typename T>
class C1
{
protected:
    T val;
    bool v;
};

template <typename T>
class C2 : public C1<T>
{
public:
    void foo()
    {
        val = 0;
        v = false;
    }
};


int main(int argc, char* argv[])
{
    C2<int> c;
    c.foo();
    return 0;
}

Пишет такое:

g++ main.cpp -o test
main.cpp: В функции-члене «void C2<T>::foo()»:
main.cpp:15:3: ошибка: нет декларации «val» в этой области видимости
main.cpp:16:3: ошибка: нет декларации «v» в этой области видимости

Если в функции указать явно C1<T>::val, = 0 то все ок. Подскажите, это нормальное поведение? можно как то избежать явного указания родительского класса?

gcc версия 4.6.1

P.S. пытаюсь собрать сторонюю либу, там таких конструкций горы


это нормальное поведение?

да

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

this->val = 0;
jtootf ★★★★★
()
Ответ на: комментарий от jtootf

я имел в виду ничего не меняя в коде)) либа старенькая, разрабы обещают компиляцию на gcc 3.x, но для меня это не вариант

s0L
() автор топика
Ответ на: комментарий от s0L

я имел в виду ничего не меняя в коде

у меня для тебя плохие новости

jtootf ★★★★★
()
using C1<T>::val;
using C1<T>::v;

а ничего не меняя - только собирая другим компилем, или используя какой нить ключ, типа -fpermissive

vvviperrr ★★★★★
()
Ответ на: комментарий от vvviperrr

>а ничего не меняя - только собирая другим компилем, или используя какой нить ключ, типа -fpermissive

-fpermissive от этого не спасает, а другим компилятором...они пишут что 3.3.1 должен работать, но это совсем древняк, я даже поставил 3.4, но не помогло ((

s0L
() автор топика
Ответ на: комментарий от s0L

я знаю, что fpermissive не спасет, поэтому и написал «типа». может существуют какие нить еще ключи, которые позволят собрать старый код

vvviperrr ★★★★★
()
Ответ на: комментарий от s0L

> я имел в виду ничего не меняя в коде

Героически тянуть в светлое будущее древний код, заведомо являющийся говном - дурная традиция, имхо. Исправь и будет тебе шшастье.

const86 ★★★★★
()
Ответ на: комментарий от const86

>Исправь и будет тебе шшастье.

я бы исправил, да больно дофига исправлять и местами вапще непонятно, как это могло компилироваться вообще чем либо...

s0L
() автор топика

P.S. пытаюсь собрать сторонюю либу, там таких конструкций горы

древний gcc такое проглатывал

Reset ★★★★★
()
Ответ на: комментарий от jtootf

Here's the rule: the compiler does not look in dependent base classes when looking up nondependent names.

Блин, я даже когда-то читал это в С++ FAQ. Но кто расскажет почему?

Стандарт пока что не читал, но планирую вскоре прочитать (даже скачал C++11).

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Но кто расскажет почему?

Как обычно, ниасилили.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.