Почему Multi Args в конструкторе не работает под Linux? - PullRequest
0 голосов
/ 21 января 2009

Для моего класса исключений у меня есть конструктор с несколькими аргументами (...), который отлично работает под Windows, однако в Linux он прекрасно компилируется, но отказывается ссылаться на него.

Почему это не работает в Linux?

вот пример:

class gcException
{
public:
    gcException()
    {
        //code here
    }

    gcException(uint32 errId, const char* format = NULL, ...)
    {
        //code here
    }
}


enum
{
    ERR_BADCURLHANDLE,
};

.

Редактировать

Так что, когда я называю это так:

if(!m_pCurlHandle)
    throw gcException(ERR_BADCURLHANDLE);

Я получаю эту ошибку компиляции:

error: no matching function for call to ‘gcException::gcException(gcException)’
candidates are: gcException::gcException(const gcException*)
                 gcException::gcException(gcException*)
                 gcException::gcException(gcException&)

Ответы [ 3 ]

6 голосов
/ 21 января 2009

Проблема в том, что ваш конструктор копирования не принимает временное значение, которое вы выдавали. Это временное и, следовательно, ценность. Ссылка на nonconst, а именно gcException& не может привязаться к ней. Читайте здесь на деталях.

Как следует из комментария к этому ответу, в компиляторе Microsoft была ошибка, из-за которой он связывал ссылки, указывающие на неконстантные объекты, принимающие значения. Вы должны изменить свой конструктор копирования на это:

gcException(gcException const& other) {
    // ...
}

Чтобы все заработало. В нем говорится, что ошибка была исправлена ​​в Visual C ++ 2005. Таким образом, вы получите ту же проблему с этой версией. Так что лучше исправьте эту проблему прямо сейчас.

2 голосов
/ 21 января 2009

Отлично компилируется и связывается. Я расширил ваш тестовый код до полной «программы»:

class gcException {
    public:
        gcException() { }
        gcException(int errId, const char* format, ...) { }
};
int main() { new gcException(1, "foo", "bar", "baz"); }

А потом g++ -Wall test.cpp побежал без ошибок. Согласно g++ -v, у меня gcc версии 4.3.2 (Debian 4.3.2-1.1). Мой быстрый пример скомпилирован для вас?

(Возможно, вы случайно скомпилировали - или связали - с помощью gcc вместо g ++?)

0 голосов
/ 21 января 2009

Ну, просто разобрался, кажется, блок кода использовал gcc вместо g ++ для компиляции файла.

...