我有一些看起来像这样的代码:
static std::string Foo(const std::string& blah)
{
if ( someWierdEdgeCase() ){
return false; // <-- this line has a compiler error
}
std::string resourcePath;
resourcePath.append("/assets/");
return resourcePath;
}
它曾经编译好,但后来我升级到Xcode 5.1,现在它不再编译。我得到的错误如下: 没有可行的转换来自&#39; bool&#39;到&#39; std :: string&#39;
我想知道我应该替换什么&#39;返回false&#39;这样就可以按照以前的方式工作了。
通常情况下,我很乐意返回虚假之外的东西,显然这不是好行为。但不知何故,这段代码用于编译和运行,我想了解它正在做什么,以防这个代码库的其他部分依赖于什么是奇怪的行为。
答案 0 :(得分:2)
此:
return false; // <-- this line has a compiler error
没有标准方法可以将bool转换为std :: string(如果gcc(旧的XCode mac编译器)中有特殊内容,请纠正我)。这意味着您的代码库用于包含将bool转换为字符串的显式代码。
如果现在没有编译,则表明此转换已从您的代码库中删除。
有几个人提出了替代方案。但我怀疑其中任何一个都会起作用。由于旧代码依赖于以前的工作方式。因此,进行任何特定的推荐将取决于如何编译旧代码以及someWierdEdgeCase()
为真时返回的内容。基本上你需要复制这种行为。
否则,您需要搜索代码中的所有用例并更改行为以匹配新行为。在这种情况下,我会更改函数的名称。重新编译并查看代码中断的位置并检查每个位置的行为并确保其行为相同。
答案 1 :(得分:1)
static std::string Foo(const std::string& blah)
{
std::string resourcePath = "";
if ( someWierdEdgeCase() ){
return resourcePath; // <-- Now you're returning a string
}
resourcePath.append("/assets/");
return resourcePath;
}
答案 2 :(得分:0)
如果您需要返回类型 - 无论出于何种原因 - 并不总是存在,请通过指针返回,而不是按值返回。
static yourType* Foo(const std::string& blah){
if ( someWierdEdgeCase() ){
return 0;
}
}
然后你可以在同一行测试和分配函数
yourType* result;
if(result = Foo("something")){
// the result was correct
当然 - 因为你的函数返回一个std::string
,你可以返回一个空字符串(""
),或者 - 也独立于返回类型 - 抛出异常。
答案 3 :(得分:0)
我遇到的一个问题是,我的接口文件和实现文件在方法声明中使用了不同的数据类型。在方法声明错误中将相同的数据类型放在两个位置都消失了。