gpt4 book ai didi

c++ - 由于每个函数之前的模板,Visual Studio 没有给我错误。 C++

转载 作者:行者123 更新时间:2023-11-28 06:41:09 25 4
gpt4 key购买 nike

由于每个函数之前的模板行,Visual Studio 没有给我错误。

例如:

template <class keyType, class valueType>
void Map<keyType, valueType>::remove (keyType key)
{
cout<<"hello"
}

它不会给我 cout 上缺少分号的错误。

我该如何解决这个问题?谢谢!

最佳答案

这是 Visual C++ 编译器的一个众所周知的缺陷。归结为:除非且直到模板被实例化,否则不会解析模板主体。

当编译器找到模板定义时,它会将其复制到内部缓冲区以供将来引用。然后,当用具体类型实例化该模板时,它会进行搜索和替换以放入具体类型,然后解析模板。

这会带来一些不良影响:

  • 正如您所注意到的,未实例化的模板不会给出错误消息。这意味着您可以编写垃圾代码,将其留在代码库中并且没有问题,直到多年后有人愚蠢地实例化您的模板并且构建以可怕的方式中断。
  • 因为编译器在解析模板时知道模板参数,依赖名称和非依赖名称之间的区别就消失了。
  • 同样,模板的解析上下文是实例化上下文,而不是定义上下文。所以,如果你在你的模板中引用了一个自由函数,你最好希望这个函数名在你的代码的不同部分没有不同的定义......
  • 因为编译器在解析模板时知道模板参数,所以 VC++ 可以在很多地方区分类型名称和表达式,而标准规定不应该区分,而您必须使用 typename 关键字来区分。此类代码无法在任何其他编译器下编译。

很公平,曾几何时,所有编译器都以这种方式解析模板。其他人都看到了它的可维护性和可移植性灾难,但微软却没有。是时候继续前进了。

关于c++ - 由于每个函数之前的模板,Visual Studio 没有给我错误。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com