我的问题似乎非常基本,但我无法找到解决方案。我需要编写一个代码,通过报告异常抛出的行和位置来帮助调试。问题是__LINE__
是int
值,我在使用std::string(line)
的以下代码中将其转换为字符串时遇到问题:
#pragma once
#include <stdexcept>
#include <cstring>
class CRuntime_error_line: public std::runtime_error
{
public:
CRuntime_error_line(const char * msg, const char * file,int line)
:runtime_error(std::string(msg)+" @"+":"+std::string(line)){}
};
#define runtime_error_line(msg) CRuntime_error_line(msg,__FILE__,__LINE__)
似乎std::string(line)
无法将int转换为字符串,其他在线建议的解决方案无法在线实现,我不知道如何在第二行调用基础构造函数!
编译器输出:
log.h:在构造函数'CRuntime_error_line :: CRuntime_error_line(const char *,const char *,int)':log.h:10:124:错误:转换无效 从'int'到'const char *'[-fpermissive] CRuntime_error_line(const char * msg,const char * file,int line):runtime_error(std :: string(msg)+“@”+“:”+ std :: string(line)){}
(使用g ++和linux环境)
修改
应该以这种方式调用宏:
throw runtime_error_line("Invalid somethihng ...!");
答案 0 :(得分:3)
正如Borgleader std::to_string
建议的那样,是您的解决方案。它还会为您构建一个临时std::string
,因此无需从msg
构建临时字符串:
#pragma once
#include <stdexcept>
#include <cstring>
#include <string> // Add this to support std::to_string
class CRuntime_error_line: public std::runtime_error
{
public:
CRuntime_error_line(const char* msg, const char* file, int line)
: runtime_error(msg + " @:"s + std::to_string(line)){} // Use std::to_string here
};
#define runtime_error_line(msg) CRuntime_error_line(msg, __FILE__, __LINE__)
如果没有C ++ 11,你仍然可以做到这一点,它不是那么干净:
#pragma once
#include <stdexcept>
#include <cstring>
#include <sstream> // Use to include std::ostringstream
class CRuntime_error_line: public std::runtime_error
{
public:
CRuntime_error_line(const char* msg, const char* file, int line)
: runtime_error(static_cast<std::ostringstream&>(std::ostringstream() << msg << " @:" << line).str()){} // Use std::ostringstream here
};
#define runtime_error_line(msg) CRuntime_error_line(msg, __FILE__, __LINE__)
答案 1 :(得分:1)
这种情况可能更好:
#define STRING_DEFINE1(x) #x
#define STRING_DEFINE(x) STRING_DEFINE1(x)
...
CRuntime_error_line(msg,__FILE__,STRING_DEFINE(__LINE__))
答案 2 :(得分:1)
我能想到的最简单的事情就是自己写一个to_string
:
#include <sstream>
std::string to_string(int i)
{
std::ostringstream os;
os << i;
return os.str();
}
然后像其他人建议的那样打电话。