我对我刚刚上班的情况有疑问。
设置: 在stringStuff.h中
namespace n1
{
namespace n2
{
typedef std::string myString;
}
}
namespace n1
{
namespace n2
{
void LTrim(myString& io_string);
void RTrim(myString& io_string);
inline void Trim(myString& io_string)
{
LTrim(io_string);
RTrim(io_string);
}
}
}
in impl.cpp
#include "stringStuff.h" // This actually gets included via other include files
#include "globalInclude.h" // contains 'using namespace n1::n2;'. Yes, I know this isn't best practice
inline static myString Trim(const myString& in_string)
{
// impl
}
static void impl(const myString& in_string, myString& out_string)
{
size_t N = 10; // just some computed value.
out_string = Trim(in_string.substr(1, N)); // This is the line with the error
}
现在,我承认我不太了解C ++名称解析规则,但是当我看到这一点时,似乎对Trim 的调用应该是不明确的。
令人惊讶的是,它在使用GCC的Linux上编译得很好,调用了impl.cpp中定义的函数。当我使用其本机编译器在HP-UX上编译时,它似乎将调用解析为在stringStuff.h中定义的调用,并且抱怨将临时转换为非常量引用(这出乎意料地是警告,而不是错误) ,以及尝试将void分配给myString。
根据C ++标准应该发生什么,以及哪个编译器(如果有的话)正确使用它?
顺便说一句,我通过在修饰前加上::来修复'在我的情况下',虽然这不是很理想。
答案 0 :(得分:2)
技巧是一个采用const引用而另一个采用非const引用,因此它们是两个不同的函数,而不是相同的函数,其分辨率可能不明确。然后归结为调用中参数的类型。由于substr返回一个值,它只能绑定到const引用。所以它应该在没有警告的情况下调用::Trim
。我会说HP-UX编译器是错误的。