C++ и GCC 2.95 проблемче

14 отговора 506 прегледа
#1

C++ и GCC 2.95 проблемче

Здравейте,

как да накарам GCC 2.95 да изкомпилира този код?
Има ли някаква опциика или просто толко си може


class A_ref;
class B_ref;

class A
{
public:
A & operator >>(A_ref &)
{
return *this;
}
};

class B : public A
{
public:
using A::operator >>;

B & operator >>(B_ref &)
{
return *this;
}
};

int main(int argc, char* argv[])
{
B b;
return 0;
}

/*
Командния ред и резултата са следните:

g++.exe -c ../Test.cpp -o ../Test.o -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include" -I"../../"

../Test.cpp:22: cannot adjust access to `class A & A::operator >>(A_ref &)' in `class B'
../Test.cpp:19: because of local method `class B & B::operator >>(B_ref &)' with same name

make.exe: *** [../Test.o] Error 1

Execution terminated
*/


Отговор
в отговор на -- #2

Re: C++ и GCC 2.95 проблемче

Не ми се чете C++ стандарта в момента, но сигурен ли си че кода е коректен? Мисля, че компилаторът е прав. Това "using A::operator >>" защо е - операторът се наследява така или иначе. Обясни какво имаш предвид, а междувременно можеш да пробваш да напишеш операторите като friend функции, така няма начин да не стане.

Отговор
в отговор на Pesho® #3

Re: C++ и GCC 2.95 проблемче

Проблема е, че това е опростен фрагмент...оригинала е мнооого по-голяма боза.
И все пак оригинала (a и този пример) се компилира с МSVC++ 6.0/7.0 и Borland C++ Builder 5.0/6.0 даже и с включена "full ANSI compatible" опция.

Освен това за наследяването не си прав. Ако има оверлоаднат оператор, и се ползва и този от родителя, трябва да се ползва using иначе се оплаква че няма такъв оператор за класа B.

Отговор
в отговор на -- #4

Re: C++ и GCC 2.95 проблемче

Прав си за това, да.
А иначе, не става ли като си препишеш операторите като friend функции?

Отговор
в отговор на Pesho® #5

Re: C++ и GCC 2.95 проблемче

не съм пробвал...казах че сорса е много голям и има много наследяване и много оператори...
Намерих материали по въпроса:

[линк]
[линк]
[линк]

Последното се оказа най полезно за мен


P.S. Имаше една тема за +/- на C++ компилаторите (от днеска ). Намерих бъг на Borland, сега и на GCC, да се готви MSVC....

Отговор
в отговор на -- #6

Re: C++ и GCC 2.95 проблемче

Какъв е проблема след като проблема е отстранен отдавна и просто трябва да се update-не gcc?

Отговор
в отговор на -- #7

Re: C++ и GCC 2.95 проблемче

Njamam 2.95 wkushti, imam gcc3.2 i gcc 2.96 - i dwata kompilirat bez problem.

Tuj kato ne sum spec po C++ standarta to chesto se obrushtam kum Comeau C++ Online test compiler -> [линк]

To err is human
To stderr is inhuman
Отговор
в отговор на qwerty #8

Re: C++ и GCC 2.95 проблемче

Проблема е, че всяко С++ е бъгаво....а бъговете се проявяват....рано или късно.

Отговор
в отговор на -- #9

Re: C++ и GCC 2.95 проблемче

Ееее, ти се изказа, всяко С било бъгаво :-)

Компилаторът на Comeau, към който прати линк малкия, се смята за еталонен. Въпросите "това валиден С++ ли е или не" се разрешават с него. Той използва фронт-енд на ЕДГ, които пък са едни дето са навътре в комитета по стандартизация. (между другото, интелския компилатор използва същия фронт-енд. между другото, майкрософтския 7.1 в това отношение би трябвало също да покрива стандарта)

Иначе за операторите - според мен също не трябва да има using.

По повод видимостта на операторите - има нещо наречено, ъммм, на български би трябвало да се нарича "Кьонигово търсене" (koenig lookup) - едно допълнително отваряне на видимостите.
Замисляли ли сте се защо след като направите:

using std::cout;

можете да пишете

cout << "Hello world!";

въпреки че оператор << също е дефиниран вътре в std, и би трябвало да пишете

std::operator<<(cout, "Hello world!");

Е точно кьониговото търсене е процедурата, при която компилатора вижда, че има неизвестен оператор <<, и го търси в namespace-а на аргументите.

---
Bingo! Bongo! I don't want to leave the Kongo!
Отговор
в отговор на Skotowydec #10

Re: C++ и GCC 2.95 проблемче

using std::cout;
можете да пишете
cout << "Hello world!";
въпреки че оператор << също е дефиниран вътре в std, и би трябвало да пишете
std::operator<<(cout, "Hello world!");
Е точно кьониговото търсене е процедурата, при която компилатора вижда, че има неизвестен оператор <<, и го търси в namespace-а на аргументите.


Wow, C++ naistina e stanal slozhen ezik :)

Dali ima optzia na kompilatora - kojato mozhe da dupmne - tekushto kakvo vizhda kompilatora kato namespace - t.e. kakuv namespace ili kakvi namespace-i pri dadeno polozhenie sa aktivni - znam che GCC ima razni debugging optzii - no ne sum se sehstal da pogledna za tazi.

Tova za turseneto w argumentite - samo pri operatorite li wazhi?

To err is human
To stderr is inhuman
Отговор
в отговор на Skotowydec #11

Re: C++ и GCC 2.95 проблемче

Може и да има идеален C++, но аз още не съм попаднал на него

Впрочем, дори любимият ти Comeau се жалва, когато е закоментарен using A::operator >> на кода по-долу.



class A
{
public:
A & operator >> (char &)
{
return *this;
}
};

class B : public A
{
public:
// using A::operator >>;

B & operator >> (int &)
{
return *this;
}
};

int main(int, char*[])
{
A a;
B b;
int i;
char c;
a >> (c);
b >> (i);
b >> (c);
}


а за GCC 3.2

този код генерира warning:


class A
{
public:
typedef std::vector<int>::iterator i;
};


Отговор
в отговор на Skotowydec #12

Re: C++ и GCC 2.95 проблемче

Абе и във фронтенда на EDG от време на време се откриват разни дребни бъгчета. Но рядко, и наистина се смята за еталонен.

А VC++ 7 си е яко бъгаво, не лъжи хората :) Вярно че е по-добре от 6, но бъгове от сорта на прословутия early template instantiation могат да ти вгорчат живота. Но има надежда за оправия де - Microsoft наеха Herb Sutter да им оправя компилатора, а на него може да се разчита.

Отговор
в отговор на -- #13

Re: C++ и GCC 2.95 проблемче

S izwinenie ne prochetoh Skotowydetza da objawjawa che Comeau mu e lubim kompilator, prosto iz C++ sredite se schita che Comeau sa edinstwenite na koito C++ kompilatora im spazwa striktno standarta (da de ama koj tochno standard i az ne moga da ti kazha).

Sljapo bih se doveril na Comeau, a ne na GCC w tozi sluchai.

Za tekushtia primer mislja che ima razlika, zashtoto

using A::operator >> wuw class B kara da aliasne tozi operator kato operator na B.

Obache seriozno naistina goljama kasha stava - mai shte trjabwa da otvarjam golemite knigi - no e wuzmozhno sled 2-3 godini da izmenjat pak nehstata (Ne tuka sum suvsem seriozen - prochete tazi statia - namerih ja sled search za "koenig lookup" - [линк] - tuj kakto predi edna-dve-tri? godini e njamalo ADL (koenig-lookup) i sega e wuweden - to ako w blizko budeshte se otkriat oshte problemi sus namespace-ovete ili podobni - shte posledwa novo izmenenie - i nanovo izuchawane - naistina rabota samo za advokati - a ne za programisti)... za boga tozi ezik sigurno stava po-slozhen ot zakonovata uredba w BG....

hehe

To err is human
To stderr is inhuman
Отговор
в отговор на malkia #14

Re: C++ и GCC 2.95 проблемче

Tova za turseneto w argumentite - samo pri operatorite li wazhi?

Ако не се лъжа, трябва да важи не само за операторите. В по-старите компилатори (MSVC6) е реализирано само за оператори, щото иначе със std streams няма да може да се работи :-)

---
Bingo! Bongo! I don't want to leave the Kongo!
Отговор
в отговор на Pesho® #15

Re: C++ и GCC 2.95 проблемче

Това, за което съм чувал много добри думи от човек-разбирач, и за което говоря, е MSVC 7.1, което влиза в Visual Studio.NET 2003, a.k.a. Everett, което още е в бета. Аз лично още работя с MSVC6 - вж. темата с хората и инструментите :-(

---
Bingo! Bongo! I don't want to leave the Kongo!
Отговор