对于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
namespace B {
enum bar {
HELLO,
WORLD
};
}file1.h
namespace A {
namespace B {
// Some stuff
}
}file2.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上的下列编译错误:
错误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 )。我的错误)。
发布于 2018-09-03 10:11:37
我无法在Visual2013和2008上复制这个bug。这似乎是2010年和2012年的一个具体问题。
可以尝试在命名空间声明之外使用ty胡枝子f:
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;
}https://stackoverflow.com/questions/52147190
复制相似问题