туплю. С++ наследоване. gcc 4

SCIF32

Чего-то туплю уже час где-то:
Были два класса, одн другой наследовал, все выставлено public:
class A
{
public:
int fff;
}
class B : public A
{
void ttt
{
printf("%d\n",fff);
}
}
Так вот, у меня компилятор стал ругаться на то, что fff не объявлено.
Что я не так делаю?

evgen5555

Что я не так делаю?

Все правильно:

туплю уже час где-то

Можешь продолжать.

Какой компилятор-то?

SCIF32

походу не я один туплю...
для тех, кто со мной на танке:
gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)
для всех остальных уже написал в теме сообщения.

pavlova

компилить командой gcc или g++ не одно и то же

SCIF32

знаю. // верси одинаковые у них
компилирую g++.
более того, раньше таких проблем (с gcc 3.4 например) не было.

SCIF32

а может дело в том, что этот тип через typename объявляется?

evgen5555

Ну надо же, успел гцц влепить
class MyFuckingClass{
public:
int nPublicProperty;
}
;// <----------

SCIF32

оно там с самого начало было - не вали с больной головы
не ну это же читерство...
а почему не работает так как есть?

evgen5555

Потому что после объявления классов стандарт разрешает объявлять переменные.

SCIF32

то что он разрешает - побоку.
почему класс не видит обхявленныю переменную класаа-предка?

margadon

так ; после закрывающейся скобки есть или нету?

SCIF32

в оригинале есть.
иначе бы и в gcc 3.4 не компилировалось бы

zya369


cat some.cpp
g++ some.cpp

в студию
ЗЫ нафик printf:?

SCIF32

пока забейте, если сразу не знаете в чем дело.
Поправить все удалось, вставыи объявление полей в класс-потомок.
Файлы большие - по ~1.5 Кстрок так что
cat думаю здесь не рулит.
Сегодня мне лень писать мелкую программку, а завтра все сделаю.

evgen5555

Файлы большие - по ~1.5 Кстрок

Сто пятьдесят тысяч строк этого?
class A 
{
public:
int fff;
}
class B : public A
{
void ttt
{
printf("%d\n",fff);
}
}

kamputer

>Сто пятьдесят тысяч строк этого?
Предыдущий был ещё круче.

SCIF32

ну и чего такого, в чем крутость то выражается?
тогда то я реально затупил вроде и ошибка была действительно в невнимательности. собственно Kai первым постом ее и разрулил.
// ковыряться в носу никому не запрещаю.

SCIF32

просто неохота было вырезать куски из файлов, класть в один и компилить.
а если все тупо сделать cat-om то вы все тут заманакаетесь нужные куски в коде искать

SCIF32

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

rosali

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

SCIF32

если человек разбирается в вопросе и встречался с проблемой, то часто ему достаточно не всех условий что бы дать ответ. Это раз.
для тех, кому интересно разобраться с проблемой я пообещал выложить сегодня маленький по размеру пример. Это два.
никому ничего не впаривал и довольно точно объяснил какое отношение кусок приведенного кода имеет к исходной программе (он описывает структуру наследования и обращения в полям класса, но типы совершенно другие). соответственно кусок этот, очевидно (если поставить ; и т.п. компилируется и понятно это невооруженным глазом.
Это три.
еще пол часа и выложу текст.

SCIF32

Пришел тот день пришел тот час.
Сорри, что может быть заставил кого-то ждать, вот выдрал кусок и пощу его здесь:
[ laz]$ cat main.cpp:
#include <stdlib.h>
#include <map>
template< class VKey, class VVal, class EdgeVal> class AttGraph {
public:
typedef std::map<VKey, VVal> Vertices;
std::map<VKey, VVal> V;
class EdgeInfo {
public:
VKey to; EdgeVal label;
EdgeInfo(const VKey& v, const EdgeVal l):to(v label(l) {}
EdgeInfo {}
EdgeInfo& operator= (const EdgeInfo& ei)
{ to=ei.to; label=ei.label; }
};
typedef std::multimap<VKey, EdgeInfo> Edges;
std::multimap<VKey, EdgeInfo> E;
std::multimap<VKey, EdgeInfo> E_rev_;
};
template <class VKey,class VVal, class EdgeVal> class AttGraphAdvanced:public AttGraph<VKey,VVal,EdgeVal> {
public:
typedef EdgeVal EVal;
typedef typename AttGraph<VKey,VVal,EdgeVal>::Edges Edges;
const Edges&
getEdgesRev const
{
return E_rev_;
}
};
int main
{
AttGraphAdvanced<long,long,long> A;
A.getEdgesRev;
}

[ laz]$ g++ main.cpp
main.cpp: In member function ‘const typename AttGraph<VKey, VVal, EdgeVal>::Edges& AttGraphAdvanced<VKey, VVal, EdgeVal>::getEdgesRev const’:
main.cpp error: ‘E_rev_’ was not declared in this scope
для интересующихся версией компилятора:
[ laz]$ g++ -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux
Thread model: posix
gcc version 4.0.0 20050519 (Red Hat 4.0.0-8)

Chupa

this->E_rev_;

SCIF32

хе хе.
пашет.
а это баг или фича?

Chupa

http://gcc.gnu.org/gcc-3.4/changes.html
искать "this->"

SCIF32

спасибо.

evgen5555

Блйа, а как же MAN?

Chupa

myrka68


5 баллов!
Оставить комментарий
Имя или ник:
Комментарий: