考虑以下C ++代码,
namespace {
class ExprParentFinder {
friend class CodeCompletionTypeContextAnalyzer;
};
}
class CodeCompletionTypeContextAnalyzer {
public:
CodeCompletionTypeContextAnalyzer() {}
};
int main() {
CodeCompletionTypeContextAnalyzer TypeAnalyzer;
return 0;
}
这与Clang / GCC编译好。但是,MSVC扼流和报告
1> ConsoleApplication2.cpp
1> consoleapplication2.cpp(29):错误C2872:' CodeCompletionTypeContextAnalyzer&#39 ;:模糊符号
1> consoleapplication2.cpp(23):注意:可能是' CodeCompletionTypeContextAnalyzer'
1> consoleapplication2.cpp(19):注意:或者'`anonymous-namespace' :: CodeCompletionTypeContextAnalyzer'
从C ++标准的角度来看,CodeCompletionTypeContextAnalyzer TypeAnalyzer
是否真的含糊不清,或者这是一个MSVC错误。如果是这样,导致此错误的是什么。
解决方法是将代码更改为
int main() {
::CodeCompletionTypeContextAnalyzer TypeAnalyzer;
return 0;
}
答案 0 :(得分:2)
这是格式良好的(即MSVC错误),但不太可能是你真正想要的。 [namespace.memdef]/3,脚注省略:
如果非本地类中的
friend
声明首先声明一个类, 朋友是其成员的函数,类模板或函数模板 最里面的封闭命名空间。friend
声明确实如此 不是单独使名称对非限定查找可见 ([basic.lookup.unqual])或限定查找([basic.lookup.qual])。
friend class CodeCompletionTypeContextAnalyzer;
声明CodeCompletionTypeContextAnalyzer
是未命名的命名空间的成员,但该名称对名称查找不可见。
然后,class CodeCompletionTypeContextAnalyzer { /* ... */ };
声明(并定义)一个名为CodeCompletionTypeContextAnalyzer
的不同的类作为
全局命名空间的成员;此课程不是ExprParentFinder
的朋友。
由于名称查找不可见未命名的命名空间CodeCompletionTypeContextAnalyzer
,因此唯一可以找到的CodeCompletionTypeContextAnalyzer
是第二个,并且没有歧义。