[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [debian] [avifile/C++] Молба за съвет относно #564868: FTBFS with g
From: |
George Danchev |
Subject: |
Re: [debian] [avifile/C++] Молба за съвет относно #564868: FTBFS with gcc-4.5 |
Date: |
Thu, 14 Jan 2010 00:31:59 +0200 |
User-agent: |
KMail/1.12.4 (Linux/2.6.30-2-686; KDE/4.3.4; i686; ; ) |
Yavor Doganov writes:
> Георги Данчев wrote:
> > статични членове (константни или не) се инициализират така:
> > http://www.icce.rug.nl/documents/cplusplus/cplusplus11.html
>
> Не виждам нищо смущаващо в avm_output.h; сигурно нещо съществено ми
> убягва?
Имах предвид, че поне аз предпочитам да инициализирам статичните членове
веднага след дефиницията на класа към който принадлежат; както съм го дал в
примера. В случая инициализацията е в cорса файла, това е окей, но е
неправилно написана, виж по-долу, как трябва да е.
> > Освен това, не е ясно върнатия указател от това new къде отива, май
> > искате да е в m_pSelf:
>
> Това признавам и на мен не ми е ясно...
Това изглежда недовършено, и не е ясно дали някога е работило както авторите
са очаквали.
> > Бах, от де взе GCC 4.5, gcc-snapshot от experimental не е 4.5,
> > доколкото виждам.
>
> Как да не е?
>
> address@hidden:~$ /usr/lib/gcc-snapshot/bin/g++ --version | head -1
> g++ (Debian 20091228-2) 4.5.0 20091228 (experimental) [trunk revision
> 155486]
>
> 4.5 е следващата (все още неиздадена) версия, със сигурност няма да
> бъде стандартния компилатор в Squeeze.
Правилно, моя грешка.
> > > [2] http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#176
> > > [3] http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#382
> > > [4] http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#147
> >
> > Тези май са за други случаи ;-)
>
> Точно така си го обяснявам и аз, но гледайки кръпката [1] за
> диагностиката на GCC, в случая оплакването е нещо като „side effect“
> или „false positive“ заради реализацията на тази част от новия
> стандарт.
>
> [1] http://gcc.gnu.org/ml/gcc-patches/2009-11/msg01378.html
Ами да, това потвърждава тезата, че сега с 4.5 невалидния код се диагностицира
като грешка:
Give helpful error for constructor name used as type.
> > Доколкото знам само компилаторите могат да извикват конструктори
> > Тип::Тип, а ти се опитваш и да връщаш това. Това което искаш е само
> > Тип или Тип* ;-)
>
> 4.4 го приема за тип, 4.5 го приема за конструктор, а се очаква тип.
>
> Не може дефиницията да е просто
>
> AvmOutput* AvmOutput::m_pSelf = 0;
Абсолютно законен код, приема се и от GCC 4.5. Тип има защото вече имаме
дефиниция на типа AvmOutput, вижда се вече на този етап защото се включва от
хедъра #include "avm_output.h".
Незаконен C++ код е:
AvmOutput::AvmOutput* AvmOutput::m_pSelf = 0;
> защото логично компилатора се оплаква, че няма такъв тип.
>
> > Аз доколкото знам typename се използва само във връзка с шаблони,
>
> Не и от GCC 4.5 нататък, доколкото мога да разбера.
>
> [*] http://gcc.gnu.org/ml/gcc-patches/2009-06/txt00006.txt
Това е нещо ново за мен, и този пач премахва коментара:
/* The `typename' keyword is only allowed in templates. */
но това не доказва, че:
typename AvmOutput::AvmOutput* AvmOutput::singleton()
{}
или:
AvmOutput::AvmOutput* AvmOutput::m_pSelf = 0;
е законен код с новия компилатор.
> > за това което се опитвате да имплементирате не са ви нужни такива
> > приложения по мое мнение.
>
> Чакай, чакай... Защо говориш в мн.ч.? :-) avifile е изоставен пакет
> в Дебиан; опитах се да коригирам по-сериозните грешки защото е
> зависимост на мой пакет (cynthiune.app), както и да направя всичко
> възможно да се компилира на всички архитектури. Не ме вълнува този
> пакет въобще, дори видях зор да изровя файлове за тестване... Така че
> нищо не се опитвам(е) да имплементирам(е), просто аз лично се опитвам
> да коригирам всяка грешка, която мога.
>
> Та на въпроса: какъв според теб е правилния подход в случая?
Честно да ти кажа, незнам. Според мен, това:
AvmOutput::AvmOutput* AvmOutput::singleton()
{
assert(m_pSelf != 0);
return m_pSelf;
}
не е валиден C++98 код, но 4.4 компилатора го позволява, а 4.5 просто е по-
стриктен, хваща го и не го харесва с право. Можем само да предполагаме, че
авторите са искали да имплементират singleton, но не се прави така, виж линка
който дадох в предния мейл. Сега, ако почнеш да ги оправяш нещата, със
сигурност ще удариш в още и още код който трябва да се изправи, а аз не мисля,
че е добра идея да си губиме времето със счупен код, при положение, че може да
се инвестира в други по-добри свободни кодове.
--
pub 4096R/0E4BD0AB <people.fccf.net/danchev/key pgp.mit.edu>