我从VS2017工作中获得了这个奇怪的行为赢得了C ++项目: 缺少Intellisence - 我只输入没有警告的纯文本,它仍然编译:
整个文件中没有显示错误。但是,当我在该函数范围之外的任何地方尝试相同的操作时,一切都按预期工作:
问题出现在我的通用函数实现中:
#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,没有帮助
答案 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)
模板仅在实例化时编译为二进制文件。如果您不使用该模板,则代码将被丢弃