澄清C ++名称查找

时间:2012-11-09 00:22:32

标签: c++

我对我刚刚上班的情况有疑问。

设置: 在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 ++标准应该发生什么,以及哪个编译器(如果有的话)正确使用它?

顺便说一句,我通过在修饰前加上::来修复'在我的情况下',虽然这不是很理想。

1 个答案:

答案 0 :(得分:2)

技巧是一个采用const引用而另一个采用非const引用,因此它们是两个不同的函数,而不是相同的函数,其分辨率可能不明确。然后归结为调用中参数的类型。由于substr返回一个值,它只能绑定到const引用。所以它应该在没有警告的情况下调用::Trim。我会说HP-UX编译器是错误的。