【发布时间】:2017-05-02 03:45:49
【问题描述】:
考虑以下 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': 不明确的符号
1> consoleapplication2.cpp(23): 注意:可能是 'CodeCompletionTypeContextAnalyzer'
1> consoleapplication2.cpp(19): note: or '`anonymous-namespace'::CodeCompletionTypeContextAnalyzer'
从 C++ 标准的角度来看,CodeCompletionTypeContextAnalyzer TypeAnalyzer 在这里真的是模棱两可,还是这是一个 MSVC 错误。如果是这样,是什么导致了这个错误。
解决方法是将代码更改为
int main() {
::CodeCompletionTypeContextAnalyzer TypeAnalyzer;
return 0;
}
【问题讨论】:
-
CodeCompletionTypeContextAnalyzer类是否曾经前向声明过? -
这是一个最小可重现的例子 - 这个代码文件是你唯一需要证明歧义的东西。
-
ExprParentFinder如果没有声明,如何知道CodeCompletionTypeContextAnalyzer的存在? -
来自朋友类 CodeCompletionTypeContextAnalyzer
-
如果您将
friend class CodeCompletionTypeContextAnalyzer;更改为friend class ::CodeCompletionTypeContextAnalyzer;会发生什么?
标签: c++ visual-c++ clang language-lawyer