Определение класса:
#pragma once
#include <string>
#include <utility>
namespace impress_errors {
#define BUFSIZE 512
class Error {
public:
Error(int number);
Error(std::string message);
Error(const char *message);
bool IsSystemError();
std::string GetErrorDescription();
private:
std::pair <int, std::string> error;
char stringerror[BUFSIZE]; // Buffer for string describing error
bool syserror;
};
} // namespace impres_errors
У меня есть кусок кода в файле posix_lib.cpp:
int pos_close(int fd)
{
int ret;
if ((ret = close(fd)) < 0) {
char err_msg[4096];
int err_code = errno;
throw impress_errors::Error::Error(err_code); //Call constructor explicitly
}
return ret;
}
И в другом файле fs_creation.cpp:
int FSCreation::GenerateFS() {
int result;
try {
result = ImprDoMakeTree(); //This call pos_close inside.
}
catch (impress_errors::Error error) {
logger.LogERROR(error.GetErrorDescription());
return ID_FSCREATE_MAKE_TREE_ERROR;
}
catch (...) {
logger.LogERROR("Unexpected error in IMPRESSIONS MODULE");
return ID_FSCREATE_MAKE_TREE_ERROR;
}
if(result == EXIT_FAILURE) {
return ID_FSCREATE_MAKE_TREE_ERROR;
}
return ID_SUCCESS;
}
На моей версии компилятора эта компилируется и работает правильно:
g ++ (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5 (Ubuntu Maverick - 10.04)
В другой версии компилятора:
g ++ (Ubuntu / Linaro 4.5.2-8ubuntu4) 4.5.2 (Ubuntu Narwhal - 11.04) вызывает
Ошибка:
posix_lib.cpp: в функции int pos_close (int):
posix_lib.cpp: 363: 46: ошибка: невозможно вызвать конструктор ‘print_errors :: Error :: Error ’напрямую
posix_lib.cpp: 363: 46: ошибка: для приведения в стиле функции удалите лишнюю ‘:: Error’
Вопросы:
1. Почему это работает на одной версии g ++ и не работает на другой?
2. Что происходит, когда я явно вызываю конструктор для создания объекта? Это правильно?
И почему это работает?