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





Он отлично компилируется и линкуется. Я расширил ваш тестовый код до полной «программы»:
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 ++?)
попробуйте изменить его с объекта кучи на объект стека и посмотрите, работает ли он по-прежнему.
Проблема в том, что ваш конструктор копирования не принимает временное значение, которое вы передаете. Это временное и, следовательно, rvalue. Ссылка на неконстант, а именно gcException&, не может связываться с ним. Подробности читайте в здесь.
Как следует из комментария к этому ответу, в компиляторе Microsoft была ошибка, из-за которой он привязывал ссылки, указывающие на неконстантные объекты, принимающие rvalue. Вы должны изменить свой конструктор копирования на это:
gcException(gcException const& other) {
// ...
}
Чтобы это работало. В нем говорится, что ошибка была исправлена в Visual C++ 2005. Таким образом, вы столкнетесь с той же проблемой и в этой версии. Так что лучше сразу исправить эту проблему.
Это для Linux, а не для vis, но я попробую ваше предложение
нет. причина, по которой он работал в Windows, заключается в том, что у vis (согласно этому комментарию парней) была ошибка, которая сделала ваш код действительным. gcc в Linux ведет себя правильно, поскольку отклоняет его. это только теория, потому что я не знаю, что такое ERR_BADCURLHANDLE в вашем коде. но это кажется вероятным.
не был ERR_BADCURLHANDLE, как видно из вашего последнего редактирования. Это потому, что вы генерируете исключение gcException (...), которое создает временное значение, которое затем генерируется внутри. но для этого требуется конструктор копирования, который принимает временные объекты. Причина, по которой он будет работать на msvC++, не изменилась.
litb: Я не вижу объявленного ctor копирования, поэтому компилятор не сгенерирует автоматически gcException (gcException const &)?
j_random_hacker. он не показал его (и некоторых других). но сообщение об ошибке ясно показывает, что у него есть другие конструкторы в капюшоне. у этой ошибки не так много других возможностей. два: во-первых, он использовал gcc (значит, ошибка компоновщика), во-вторых, ему пришлось исправить свой конструктор копирования.
обратите внимание, что ctor, принимающий свой тип класса посредством ссылки на неконстант, также является конструктором копирования.
Ну просто разобрался, кажется, блок кода использовал gcc вместо g ++ для компиляции файла.
Да, это то, что я сказал. В основном потому, что я сделал это по ошибке при компиляции моего тестового примера :-D
выглядит нормально. ошибка где-то еще. вам нужно разместить больше контекста. по крайней мере, ваше сообщение об ошибке компоновщика, конечно.