可能有谷歌搜索会回答这个问题,但对于我的生活,我想不出一个没有得到数百万无关答案的答案。
所以,
在MSVC文本里面引用“像这样”,我认为,作为std :: string或者std :: string&amp ;.在g ++ / gcc中,它似乎总是被视为const char *。真?
我找到了一个我想玩的代码片段,它包含
if(NULL == key)
throw exception("Empty key");
在MSVC / VC ++中编译得很好(2008年(但是当我在g ++(4.4.3)上尝试时,我得到了
no matching functions for calls to std::exception::exception(const char&)
我让这个工作:
if (NULL == key)
{
std::string estr ("Empty key");
throw exception("Empty key");
}
但那简直太丑了。
这给我带来了不同的错误:
std::string estr ("");
if (NULL == key)
{
estr = "Empty key";
throw exception("Empty key");
}
我不知道exception()期望什么作为其输入。我找到了一些建议std :: string或者std :: string&但是我丢失了那个页面,而且我发现的数以百万计的无用页面都是无用的。有关异常类,异常使用的各种信息,....
没有我的丑陋修复,是否有一种简单的方法告诉g ++“这是一个std :: string”而不是一个const char&并且仍然保持VC ++的快乐? (显然我正试图从单一来源做交叉编译代码。)
就此而言,如何id
throw exception("Empty key");
与
不同 throw "Empty key";
谢谢,
韦斯
答案 0 :(得分:3)
字符串文字总是具有char
数组的类型,其大小足以包含文字中带有空终止符的字符。因此"Empty key"
的类型为char[10]
。如果需要,可以将其隐式转换为char const *
或std::string
。
错误是因为exception
旨在作为异常类型的基类,而不是直接实例化的基类。您应该抛出<stdexcept>
中定义的一种类型,例如std::runtime_error
(可以使用字符串构造),或者定义继承std::exception
并覆盖what()
的自己的类型
我猜微软已经为std::exception
添加了一个非标准的构造函数。他们喜欢以奇怪的方式扩展语言。
答案 1 :(得分:2)
std :: exception是基类。
尝试改为抛出std :: runtime_error。
答案 2 :(得分:2)
避免按类型std::string
抛出异常,因为它们本身可以抛出异常。如果发生这种情况,最终会出现未定义的行为。
抛出<stdexcept>
中定义的标准异常或让您自己的异常类派生自std::exception
类并抛出它。并覆盖what()
方法以添加异常的适当描述。
此外,始终throw
按值,catch
按参考。
答案 3 :(得分:0)
"like this"
始终被视为const char
的数组。这不是问题所在。真正发生的是std::exception
只有默认构造函数,再次根据标准。通常包含一个带有文本字符串的附加构造函数,但是这个构造函数在VC ++和g ++中的工作方式不同,如您的示例所示。
我这里没有g ++文档,但是从你的例子看,它看起来像是将非标准构造函数定义为:
explicit exception(const std::string&);
而VC ++将非标准构造函数定义为:
explicit exception(const char*);