gpt4 book ai didi

c++ - 完全限定的静态成员定义不会编译

转载 作者:行者123 更新时间:2023-11-30 03:04:13 24 4
gpt4 key购买 nike

namespace A
{
class B
{
public:
B(int);
};
}

namespace C
{
class D
{
static const ::A::B b;
};
}

const ::A::B ::C::D::b(0); // #1
// const ::A::B C::D::b(0); // #2
// const ::A::B (::C::D::b)(0); // #3

选项 #1 编译失败。现在我已经考虑了一段时间,我很确定编译器认为“B”和“::C”之间的空格无关紧要,所以它试图在“B”中找到一个成员“C”。如果是这种情况,我需要一些方法让编译器相信这是两个独立的限定名称。

选项 #2 和 #3 似乎都适用于非常小的测试。 #3 似乎不太容易受到名称冲突的影响,因为它更有资格。 #3 对我来说也更容易切换到。所以我倾向于 #3,但它看起来很奇怪。

是否有充分的理由偏爱其中一个?我可以期望两者都能在其他编译器上正常工作吗?是否有比其中任何一个更好的解决方案?就此而言,我对 #1 失败的原因是否正确?

可能是不必要的细节

  • 激发这个问题的代码是由我编写的源代码生成器输出的。标识符源自生成器的输入,因此我担心名称冲突,特别是范围之间的无意阴影,生成器无法检测到。因此,我编写了生成器以尽可能完整地限定每个标识符。
  • 我在 VC2010 上编译。
  • 我有意使用 C++0X 特性,因为我希望代码可以移植到某些较旧的编译器。
  • 具体的编译器错误是“error C3083: 'C': the symbol to the left of a '::' must be a type”

最佳答案

I'm pretty sure the compiler considers the whitespace between "B" and "::C" insignificant, so it is trying to find a member "C" inside "B"

完全正确。

Is there any strong reason to prefer one over the other? Can I expect both to work correctly on other compilers?

选项 #3 对我来说很好(并且合规);也就是说,如果您真的受困于这个看起来相当愚蠢的要求。 :)

我自己用总结a blog post on a very similar "issue" .

关于c++ - 完全限定的静态成员定义不会编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8796936/

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