【发布时间】:2011-10-28 12:00:32
【问题描述】:
可能有一个谷歌搜索可以回答这个问题,但在我的一生中,我想不出一个能得到数百万个不相关的答案。
所以,
我认为,在 MSVC 中,引号内的“like this”文本被用作 std::string 或 std::string&。在 g++/gcc 中,它似乎总是被视为 const char*。是吗?
我找到了一个我想玩的代码 sn-p,它包含
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++ 满意? (显然我正在尝试从单一来源做交叉编译代码。)
关于那件事,如何识别
throw exception("Empty key");
不同于
throw "Empty key";
谢谢,
韦斯
【问题讨论】:
-
抛出异常(new std::string("Empty key"));
-
@DrewBurcett:
exception没有非默认构造函数,因此即使创建内存泄漏是个好主意(它不是),这也不起作用。 -
@MikeSeymour:好吧,也许我误会了。编译器是否没有告诉他异常需要 std::string?如果是这种情况,您将如何抛出一个传入 std::string 的异常,该异常将被销毁,因为控制权将永远不会传递回异常之外的任何点?
-
@DrewBurcett:错误是说没有匹配的构造函数,并且没有说明预期的内容。
exception的标准子类(例如runtime_error)存储了用于初始化它们的字符串的副本,该副本与异常对象本身一样长。
标签: c++ visual-c++ g++