VS2017编译语法不正确的代码,Intellisence缺失

时间:2017-11-02 16:04:20

标签: c++ compilation visual-studio-2017 intellisense compiler-warnings

我从VS2017工作中获得了这个奇怪的行为赢得了C ++项目: 缺少Intellisence - 我只输入没有警告的纯文本,它仍然编译:

enter image description here

整个文件中没有显示错误。但是,当我在该函数范围之外的任何地方尝试相同的操作时,一切都按预期工作:

enter image description here

问题出现在我的通用函数实现中:

#pragma region Public API
template <typename Key, typename Value>
void BinarySearchTree<Key, Value> ::Put(Key key, Value val)
{
    Node node = root_;
    if(node.key == null)
        sadadasd
        affsa
        dasds
        dasdsad
        asdsad
}

#pragma endregion

类定义如下:

template <typename Key, typename Value>
class BinarySearchTree {};

再次,它是沉默的 - 根本没有红/黄。编译的代码甚至运行。好像这部分被注释掉了。

尝试重装VS,没有帮助

5 个答案:

答案 0 :(得分:5)

这是Visual C ++的一个已知问题,已存在很长时间了。它不实现两阶段查找。它基本上只是完全跳过模板,直到它们被实例化。显然,他们最终修复了它(至少部分地)。

https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/

答案 1 :(得分:3)

根据class template参考:

  

类模板本身不是类型,对象或任何其他类型   实体。不包含仅包含的源文件的代码   模板定义。为了显示任何代码,模板必须   实例化......

更新:这似乎是特定于Visual C ++的错误。其他编译器可能会发出错误 Trivial example for GCC

此SO帖子中有关此主题的更多信息:
What exactly is "broken" with Microsoft Visual C++'s two-phase template instantiation?

答案 2 :(得分:1)

  

类模板实例化类模板本身不是类型,   或对象或任何其他实体。 未从源生成代码   仅包含模板定义的文件。为了任何代码   出现时,必须实例化模板:模板参数必须   提供以便编译器可以生成实际的类(或   功能,来自功能模板)。

答案 3 :(得分:-1)

在您使用带有参数的模板之前,它不会被实例化,因此它不会存在,因此不会出现错误。

答案 4 :(得分:-1)

模板仅在实例化时编译为二进制文件。如果您不使用该模板,则代码将被丢弃