C++ 当存在内联命名空间时,如何显式引用封闭命名空间? 请考虑此代码: #include <iostream> namespace Foo{ void ool() // Version A { std::cout << "Foo::ool" << std::endl; } inline namespace Bar{ void ool() // Version B { std::cout << "Foo::Bar::ool" << std::endl; } } } int main() { Foo::ool(); // <- error } #包括 名称空间Foo{ void ool()//版本A { std::cout

C++ 当存在内联命名空间时,如何显式引用封闭命名空间? 请考虑此代码: #include <iostream> namespace Foo{ void ool() // Version A { std::cout << "Foo::ool" << std::endl; } inline namespace Bar{ void ool() // Version B { std::cout << "Foo::Bar::ool" << std::endl; } } } int main() { Foo::ool(); // <- error } #包括 名称空间Foo{ void ool()//版本A { std::cout,c++,c++11,namespaces,inline-namespaces,C++,C++11,Namespaces,Inline Namespaces,我认为当内联名称空间确实有一个同名的方法ool时,您不能含糊地引用ool 但是你可以试试这个 #include <iostream> namespace Foo{ inline namespace A { void ool() // Version A { std::cout << "Foo::ool" << std::endl; } } namespace

我认为当内联名称空间确实有一个同名的方法
ool
时,您不能含糊地引用
ool

但是你可以试试这个

#include <iostream>

namespace Foo{

    inline namespace A {
        void ool()  // Version A
        {
            std::cout << "Foo::ool" << std::endl;
        }
    }

    namespace Bar{
        void ool() // Version B
        {
            std::cout << "Foo::Bar::ool" << std::endl;
        }
    }
}


int main()
{
    Foo::ool();  // no error
}
#包括
名称空间Foo{
内联命名空间A{
void ool()//版本A
{

std::cout一旦看到内联名称空间,就不能明确地引用在封闭名称空间中定义的符号

特别是对于您来说,
main
中的限定查找被正确地标记为不明确(正如您自己所说的)。请参阅以下内容的最后一点:

检查封闭命名空间的限定名称查找将包括内联命名空间中的名称,即使封闭命名空间中存在相同的名称


然而,其他人在评论中指出,当您尝试使用
std::pair
时,您可能在工具链调用中面临配置问题

要解决此问题,您需要确保调用编译器来编译C++11代码,该代码将带有以下标志:

-std=c++11
-std=c++0x
取决于您的Clang/GCC版本

提供进一步的上下文:

内联命名空间是C++ 11的特性,主要介绍允许在库中进行符号版本化。C++标准库实现可以定义嵌套名称空间中的不同版本的符号(非标准名称)。,并且根据编译时请求的库版本,工具链将其中一个嵌套命名空间定义为内联。您似乎正在使用库的c++11版本(因为它在内联命名空间
\u 1
中定义了一些符号,特别是
),因此在内联名称空间中使用符号实际上是您想要的。

我认为这是不可能的;从:

检查封闭命名空间的限定名称查找将包括内联命名空间中的名称,即使封闭命名空间中存在相同的名称

但是,您似乎并不处于您描述的实际情况中,因为您说这两个定义是从不同的文件中提取的。因此,您将更外部的定义“添加书签”,以便能够在需要时调用它:

#include <iostream>

// Equivalent of first include
namespace Foo{
    void ool()  // Version A
    {
        std::cout << "Foo::ool" << std::endl;
    }
}

const auto& foo_ool = Foo::ool;

// Equivalent of second include
namespace Foo{
    inline namespace Bar{
        void ool() // Version B
        {
            std::cout << "Foo::Bar::ool" << std::endl;
        }
    }
}

int main()
{
    foo_ool(); // Works
}

在引入引用std::pair的_u1::pair之前,可能先定义一个别名模板?您确定没有看到吗?(基本上,解决方案是将
-std=c++0x
(或与较新的编译器类似)添加到编译选项中。)您使用的编译器版本和设置是什么?utnapistim:您是正确的。我在具体案例中遇到了这种解决方法,但它让我好奇如何在一般情况下解决这种特定的歧义。我认为解决方法更多地适用于我在std=libstdc++中的案例,但它确实解决了我的编译问题,谢谢!是的,我实际上解决了my以这种方式表示问题,但我想知道如何以更一般的方式解决它。无论如何,感谢您指出这些。@YvesQuemener从语义上讲,您不需要到达封闭符号:如果您在同一命名空间中多次定义了同一符号(模重载)(通过使用声明或通过内联名称空间直接编写),问题在于多重声明本身,而不是如何解决它们:)是的,但是如果问题在于符号被重载,为什么编译器在发生时不发出警告呢?毕竟,它确实在同一范围内发出了一个重复定义的错误。谢谢。我觉得奇怪的是,编译器会接受用一个新的内联定义无声地重载一个类。中的Foo::ool函数封闭的名称空间变得完全无法访问。在我看来,这种行为至少应该触发一个警告。但感谢书签技巧。这是最接近解决此问题的方法。
#include <my_first_include>

// bookmark code

#include <my_second_include>

// rest of the code