首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套命名空间与VS 2012混淆

嵌套命名空间与VS 2012混淆
EN

Stack Overflow用户
提问于 2018-09-03 09:46:23
回答 1查看 101关注 0票数 2

对于VS 2012的简单代码,我有一个问题。我在centOS 7、Debian 8、9、Fedora 25、26、27、28和Ubuntu14.04、16.04、18.04上测试了这段代码,使用官方软件包中最新的GCC和Clang编译器,以及VS 2013、VS 2015、VS 2017。它起作用了。

以下是入罪守则的最低版本:

file0.h

代码语言:javascript
复制
namespace B {
    enum bar {
        HELLO,
        WORLD
    };
}

file1.h

代码语言:javascript
复制
namespace A {
namespace B {
    // Some stuff
}
}

file2.h

代码语言:javascript
复制
#include "file0.h"

namespace A {
namespace C {

    template<::B::bar = ::B::HELLO> class foo {
        // Some stuff
    };    
}
}

main.cpp

代码语言:javascript
复制
#include <iostream>
#include "file0.h"
#include "file1.h"
#include "file2.h"

int main() {
    ::A::C::foo<> myFoo;
    // Some stuff
}

此代码导致VS 2012上的下列编译错误:

错误C2039:'bar‘:不是'A::B’的成员

由于我们位于文件2.h中的命名空间::A::C (因此在名称空间::A中),并且请求命名空间::B,因此VS 2012似乎忽略了B之前的::,并且首先在当前的名称空间::A中搜索。因为它没有在bar中找到::A::B,所以它只是抛出一个错误,而不是在更高级别的范围中进行搜索。

考虑到堆栈溢出的以下答案,在VS 2012中出现了一个带有命名空间解析的bug。

我的问题是:

有没有办法在不更改名称空间的情况下解决这个问题(对我来说,保持B在::B和:a::b中非常重要)?比如使用其他语法来使用名称空间,还是使用别名命名空间?

注意:错误再现的代码是经过编辑的(与我最初的文章相比,它实际上涉及第三个文件file0.h )。我的错误)。

EN

回答 1

Stack Overflow用户

发布于 2018-09-03 10:11:37

我无法在Visual2013和2008上复制这个bug。这似乎是2010年和2012年的一个具体问题。

可以尝试在命名空间声明之外使用ty胡枝子f:

代码语言:javascript
复制
namespace B {
    enum bar {
        HELLO,
        WORLD
    };
}
typedef ::B::bar my_type;
namespace A {
    namespace B {

        template<my_type= ::B::WORLD> class foo {
        };

    }
}

int main(int argc, char* argv[])
{
    A::B::foo<> myFoo;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52147190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档