C++ и GCC 2.95 проблемче
14 отговора
506 прегледа
C++ и GCC 2.95 проблемче
Здравейте,
как да накарам 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
*/
Re: C++ и GCC 2.95 проблемче
Не ми се чете C++ стандарта в момента, но сигурен ли си че кода е коректен? Мисля, че компилаторът е прав. Това "using A::operator >>" защо е - операторът се наследява така или иначе. Обясни какво имаш предвид, а междувременно можеш да пробваш да напишеш операторите като friend функции, така няма начин да не стане.
Re: C++ и GCC 2.95 проблемче
Проблема е, че това е опростен фрагмент...оригинала е мнооого по-голяма боза.
И все пак оригинала (a и този пример) се компилира с МSVC++ 6.0/7.0 и Borland C++ Builder 5.0/6.0 даже и с включена "full ANSI compatible" опция.
Освен това за наследяването не си прав. Ако има оверлоаднат оператор, и се ползва и този от родителя, трябва да се ползва using иначе се оплаква че няма такъв оператор за класа B.
И все пак оригинала (a и този пример) се компилира с МSVC++ 6.0/7.0 и Borland C++ Builder 5.0/6.0 даже и с включена "full ANSI compatible" опция.
Освен това за наследяването не си прав. Ако има оверлоаднат оператор, и се ползва и този от родителя, трябва да се ползва using иначе се оплаква че няма такъв оператор за класа B.
Re: C++ и GCC 2.95 проблемче
Прав си за това, да.
А иначе, не става ли като си препишеш операторите като friend функции?
А иначе, не става ли като си препишеш операторите като friend функции?
Re: C++ и GCC 2.95 проблемче
не съм пробвал...казах че сорса е много голям и има много наследяване и много оператори...
Намерих материали по въпроса:
[линк]
[линк]
[линк]
Последното се оказа най полезно за мен
P.S. Имаше една тема за +/- на C++ компилаторите (от днеска
). Намерих бъг на Borland, сега и на GCC, да се готви MSVC....
Намерих материали по въпроса:
[линк]
[линк]
[линк]
Последното се оказа най полезно за мен
P.S. Имаше една тема за +/- на C++ компилаторите (от днеска
Re: C++ и GCC 2.95 проблемче
Какъв е проблема след като проблема е отстранен отдавна и просто трябва да се update-не gcc?
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
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
Re: C++ и GCC 2.95 проблемче
Проблема е, че всяко С++ е бъгаво....а бъговете се проявяват....рано или късно.
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!
Компилаторът на 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!
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
можете да пишете
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
Re: C++ и GCC 2.95 проблемче
Може и да има идеален C++, но аз още не съм попаднал на него
Впрочем, дори любимият ти Comeau се жалва, когато е закоментарен using A::operator >> на кода по-долу.
а за GCC 3.2
този код генерира warning:
Впрочем, дори любимият ти 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;
};
Re: C++ и GCC 2.95 проблемче
Абе и във фронтенда на EDG от време на време се откриват разни дребни бъгчета. Но рядко, и наистина се смята за еталонен.
А VC++ 7 си е яко бъгаво, не лъжи хората :) Вярно че е по-добре от 6, но бъгове от сорта на прословутия early template instantiation могат да ти вгорчат живота. Но има надежда за оправия де - Microsoft наеха Herb Sutter да им оправя компилатора, а на него може да се разчита.
А VC++ 7 си е яко бъгаво, не лъжи хората :) Вярно че е по-добре от 6, но бъгове от сорта на прословутия early template instantiation могат да ти вгорчат живота. Но има надежда за оправия де - Microsoft наеха Herb Sutter да им оправя компилатора, а на него може да се разчита.
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
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
hehe
To err is human
To stderr is inhuman
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!
Ако не се лъжа, трябва да важи не само за операторите. В по-старите компилатори (MSVC6) е реализирано само за оператори, щото иначе със std streams няма да може да се работи :-)
---
Bingo! Bongo! I don't want to leave the Kongo!
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!
---
Bingo! Bongo! I don't want to leave the Kongo!