VS2017编译语法不正确、缺少智能的代码 我从VS2017获得了这个奇怪的行为,赢得了C++项目: Intellisence缺失-我只是键入没有警告的纯文本,它仍然编译:

VS2017编译语法不正确、缺少智能的代码 我从VS2017获得了这个奇怪的行为,赢得了C++项目: Intellisence缺失-我只是键入没有警告的纯文本,它仍然编译:,c++,compilation,visual-studio-2017,intellisense,compiler-warnings,C++,Compilation,Visual Studio 2017,Intellisense,Compiler Warnings,整个文件中不显示任何错误。但是,当我在该函数范围之外的任何地方尝试相同的方法时,一切都会按预期进行: 问题出现在我的通用函数实现中: #pragma region Public API template <typename Key, typename Value> void BinarySearchTree<Key, Value> ::Put(Key key, Value val) { Node node = root_; if(node.key ==

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

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

#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
#布拉格地区公共API
模板
void BinarySearchTree::Put(Key,Value val)
{
节点节点=根节点;
if(node.key==null)
萨达达斯德
affsa
达斯
达斯萨德
asdsad
}
#布拉格端区
类定义如下:

template <typename Key, typename Value>
class BinarySearchTree {};
模板
类二进制搜索树{};
再一次,它是死寂的——根本没有红色/黄色。编译代码甚至可以运行。就好像那部分已经出来了


已尝试重新加载VS,但没有帮助

除非将模板与参数一起使用,否则它将不会实例化,因此它将不存在,因此不会出现错误

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

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

根据参考资料:

类模板本身不是类型、对象或任何其他类型 实体。从仅包含 模板定义。若要显示任何代码,必须使用模板 被实例化

<强> Update <强>:这看起来是一个VisualC++特定的bug。其他编译器可能会发出错误。

有关此SO帖子主题的更多信息:

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


你真的在代码中的任何地方实例化了这个模板吗?@Ron我可以把它放到main中,例如:
BinarySearchTree bst无错误模板化代码中的错误将延迟,直到模板展开。当然这从来没有发生过。我不知道为什么每个人都把实例化带到这里来。在实例化之前,仍会检查模板的语法错误,并进一步检查不依赖于模板参数的部分。这是一个MSVC的错误,当他们完全支持两阶段查找时,可能会被修复。如果有人想知道的话,大规模的向下投票是我。我否决了任何暗示这种行为是正确的人(到目前为止,每个人都是这样)。是的,在构建时会显示错误,并实例化一个成员。。。。但你们是在告诉我,我必须构建一个解决方案来检测模板实现中的语法错误,而且我在编写它们时根本并没有任何智能?一般来说,除非你们不知道模板参数,否则检查模板的正确性是没有用的。因为模板可能允许您调用类似
T.dance()的东西,在知道
t
是否具有函数
dance()
@Arkady之前,您无法检查它是否正确,正如OP关注的问题所表明的那样,提前检查正确性并不是没有用的。在编写模板而不是测试模板时,您会发现大量错误(或者更糟糕的是,您没有编写测试,并且在发布模板后出现问题)。该标准指出了哪些部分需要以后处理。@chris,将此视为任务。在你知道什么是
T
和它是否有成员
sdfsd
之前,你需要为像
T.sdfsd
这样的困难情况创建一个非常聪明的检查系统,如果不使用它,没有人需要它。但由于只有人在使用它,您可以免费获得所有用例变体的全面检查。所以,没有理由解决这个问题。很高兴拥有它,但我认为它绝对不是什么重要的东西。这就是为什么它能在地球上存活这么久VS@Arkady,这就是
T.sdfsd
延迟的原因。您可以延迟依赖于模板参数的操作,并检查不依赖于模板参数的操作。但这并不理想。这就是C++的指定方式。编译器必须这样做,而MSVC(还没有)这样做。看起来部分支持已经过时了。我能够在和
/permissive-
中获得一个错误。