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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.