gpt4 book ai didi

c++ - 嵌套命名空间与 VS 2012 混淆

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:57 25 4
gpt4 key购买 nike

我在使用 VS 2012 时遇到了一个非常简单的代码问题。我在 centOS 7、Debian 8、9、Fedora 25、26、27、28 和 Ubuntu 14.04、16.04、18.04 上测试了这段代码,均使用最新的 GCC 和官方包中的 Clang 编译器,以及 VS 2013、VS 2015、VS 2017。它有效。

这是被控代码的最低版本:

文件0.h

namespace B {
enum bar {
HELLO,
WORLD
};
}

文件1.h

namespace A {
namespace B {
// Some stuff
}
}

文件2.h

#include "file0.h"

namespace A {
namespace C {

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

main.cpp

#include <iostream>
#include "file0.h"
#include "file1.h"
#include "file2.h"

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

此代码在 VS 2012 上导致以下编译错误:

error C2039: 'bar' : is not a member of 'A::B'

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

鉴于 following answer在 Stack Overflow 上,VS 2012 中似乎存在 namespace 解析错误。

我的问题是:

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

注意:bug重现的代码是经过编辑的(与我原来的帖子相比,它实际上涉及到第三个文件file0.h。我的错误)。

最佳答案

我无法在 Visual 2013 和 2008 上重现此错误。这似乎是 2010 年和 2012 年的一个特定问题。

也许在命名空间声明之外尝试 typedef:

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;
}

关于c++ - 嵌套命名空间与 VS 2012 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52147190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com