gug-bg-herd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avifile/C++] Молба за съвет о тносно #564868: FTBFS with gcc-4.5


From: Yavor Doganov
Subject: [avifile/C++] Молба за съвет о тносно #564868: FTBFS with gcc-4.5
Date: Wed, 13 Jan 2010 17:36:59 +0200
User-agent: Wanderlust/2.15.6 (Almost Unreal) SEMI/1.14.6 (Maruoka) FLIM/1.14.9 (Gojō) APEL/10.7 Emacs/23.1 (i486-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)

[ Радвам се, че дебианския списък се върна. ]

[ Списъкът на GUG-BG е в CC, защото ми помогнаха с някои съвети около
  моите QA-премеждия с avifile, така че допускам някои от абонатите са
  запознати поне бегло с кода. ]

Понеже съм много (ама мноооо) бос по отношение на C++, моля за съвет
относно avifile и #564868.
avifile/1:0.7.48~20090503.ds-2 не се компилира с GCC 4.5 [1]:

common/avm_output.cpp:17:1: error: 'avm::AvmOutput::AvmOutput' names the 
constructor, not the type
common/avm_output.cpp:58:1: error: 'avm::AvmOutput::AvmOutput' names the 
constructor, not the type

[1] http://bugs.debian.org/564868

Доколкото разбирам, това е следствие от частичната реализация на DR
176 [2] и свързаните DR 382 [3], DR 147 [4] (и може би някои други).

[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

В случая AvmOutput::AvmOutput наистина е конструктора, но понеже типа
е именуван по същия начин, няма как той да се укаже (според моето
съвсем скромно мнение), освен с ключовата дума `typename'.  Понеже GCC
4.4 и надолу дават грешка (`typename' е приложимо само за шаблони),
което доколкото разбирам е ненужно ограничение в контекста на новия
стандарт, то е премахнато в ствола [5] на GCC.  С други думи, след
доста часове главоблъскане и четене не виждам друг начин за корекция
на тази грешка, така че кода да се компилира с всички (модерни) версии
на GCC.

[5] http://gcc.gnu.org/ml/gcc-patches/2009-06/msg00237.html

Коментари, идеи, други предложения, мъмрене?

За удобство, ето извадка от съответните декларации:

class AVMEXPORT AvmOutput
{
public:
    static void createAvmOutput();
    static int getLevel() { return m_iLevel; }
    static AvmOutput* singleton();
    ~AvmOutput();
    void write(const char* mode, const char* format, ...) _avm_printf_attr(3, 
4); // debuglevel 0
    void write(const char* mode, int debuglevel, const char* format, ...) 
_avm_printf_attr(4, 5); // any debuglevel
    void vwrite(const char* mode, const char* format, va_list va) 
_avm_printf_attr(3, 0);
    void vwrite(const char* mode, int debuglevel, const char* format, va_list 
va) _avm_printf_attr(4, 0);
    void setDebugLevel(const char* mode, int level);
    void resetDebugLevels(int level = 0);
private:
    AvmOutput();                                //!< Only to be called by 
createAvmOutput
    AvmOutput(const AvmOutput&);                //!< Forbid copy constructor
    AvmOutput& operator=(const AvmOutput&);     //!< Forbid assignment
    void vwrite(const char* format, va_list va) _avm_printf_attr(2, 0);
    void flush();
    struct AvmOutputPrivate;
    struct AvmOutputPrivate* priv;
    static AvmOutput* m_pSelf;
    static int m_iLevel;
};

static AvmOutput* AvmOutput() { return AvmOutput::singleton(); }

Description: Fix FTBFS with GCC 4.5.
Bug-Debian: http://bugs.debian.org/564868
Author: Yavor Doganov <address@hidden>
Last-Update: 2010-01-13

--- avifile-0.7.48~20090503.ds.orig/lib/common/avm_output.cpp
+++ avifile-0.7.48~20090503.ds/lib/common/avm_output.cpp
@@ -14,7 +14,11 @@ avm::CPU_Info freq; // will be initializ
 
 AVM_BEGIN_NAMESPACE;
 
+#if __GNUC__ == 4 && __GNUC_MINOR__ >= 5
+typename AvmOutput::AvmOutput* AvmOutput::m_pSelf = 0;
+#else
 AvmOutput::AvmOutput* AvmOutput::m_pSelf = 0;
+#endif
 int AvmOutput::m_iLevel = 0; // debug level
 
 struct AvmOutput::AvmOutputPrivate
@@ -55,7 +59,11 @@ void AvmOutput::createAvmOutput()
     new AvmOutput();
 }
 
+#if __GNUC__ == 4 && __GNUC_MINOR__ >= 5
+typename AvmOutput::AvmOutput* AvmOutput::singleton()
+#else
 AvmOutput::AvmOutput* AvmOutput::singleton()
+#endif
 {
     assert(m_pSelf != 0);
     return m_pSelf;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]