Почему Multi Args в конструкторе не работает под Linux?

Для моего класса исключений у меня есть конструктор с несколькими аргументами (...), который отлично работает под окнами, однако под 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&)

выглядит нормально. ошибка где-то еще. вам нужно разместить больше контекста. по крайней мере, ваше сообщение об ошибке компоновщика, конечно.

Johannes Schaub - litb 21.01.2009 08:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
187
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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 ++?)

попробуйте изменить его с объекта кучи на объект стека и посмотрите, работает ли он по-прежнему.

Lodle 21.01.2009 08:24

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

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

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

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

Это для Linux, а не для vis, но я попробую ваше предложение

Lodle 21.01.2009 08:26

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

Johannes Schaub - litb 21.01.2009 08:28

не был ERR_BADCURLHANDLE, как видно из вашего последнего редактирования. Это потому, что вы генерируете исключение gcException (...), которое создает временное значение, которое затем генерируется внутри. но для этого требуется конструктор копирования, который принимает временные объекты. Причина, по которой он будет работать на msvC++, не изменилась.

Johannes Schaub - litb 21.01.2009 08:52

litb: Я не вижу объявленного ctor копирования, поэтому компилятор не сгенерирует автоматически gcException (gcException const &)?

j_random_hacker 21.01.2009 13:00

j_random_hacker. он не показал его (и некоторых других). но сообщение об ошибке ясно показывает, что у него есть другие конструкторы в капюшоне. у этой ошибки не так много других возможностей. два: во-первых, он использовал gcc (значит, ошибка компоновщика), во-вторых, ему пришлось исправить свой конструктор копирования.

Johannes Schaub - litb 21.01.2009 18:30

обратите внимание, что ctor, принимающий свой тип класса посредством ссылки на неконстант, также является конструктором копирования.

Johannes Schaub - litb 21.01.2009 18:31

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

Да, это то, что я сказал. В основном потому, что я сделал это по ошибке при компиляции моего тестового примера :-D

derobert 21.01.2009 08:36

Другие вопросы по теме