为什么VS2008在没有警告的情况下编译时使用了错误的模板逻辑
Why VS 2008 compile with no warning with an erroneous template logic?
我有一个简单的模板示例,如下所示:
template<class T> class A {
friend int f(T);
}
int main(){
A<int> a;
return 0;
}
该代码在VS2008中编译和执行时没有发出警告(未使用的变量除外)。我认为这应该是一个问题,因为我们在同一个类中只获得了一个定义的非模板函数的许多版本。我错过什么了吗?
为什么此代码会产生错误?对于实例化A
的每一个T
,都会声明一个新函数并添加好友。永远不会有两个相同的函数,因为你不能为同一类型实例化一个模板两次(你只需要重用旧的实例化)。
此外,即使以某种方式可以生成两个相等的声明,也不会有歧义,因为函数首先在类中声明。因此,除了依赖于参数的查找之外,其他任何方法都无法找到它们。(基本上,这些函数是无用的,因为它们不能被调用)
§7.3.1.2 [namespace.memdef] p3
[…]如果非局部类中的
friend
声明首先声明了一个类或函数,则友类或函数是最内部封闭命名空间的成员在该命名空间范围中提供匹配声明之前(在授予友谊的类定义之前或之后),通过非限定查找或限定查找都找不到朋友的名称。[…]
另外,请参阅此。
根据C++标准,对未使用的模板函数进行语法检查的程度取决于实现。编译器不进行任何语义检查——例如,不查找符号。
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- std::is_base_of表示ctor编译错误
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- Qt Cmake 错误编译"GuiSupportQt not found"
- Opengl 精度转换错误编译错误 E0415
- 库将ARM架构错误编译为架构X64
- RT 音频 Mac 错误 g++ 编译错误
- 错误编译Boost.log
- 错误编译QT创建者 / QT窗口小部件示例
- 错误编译MIPS32
- Visual Studio 2013 中的错误(编译和运行代码)
- 链接错误编译qt项目在visual 2010
- 无法用模板错误编译nsgmls
- 奇怪的错误.编译失败
- 如果有人调用c++中的方法,则强制错误(编译时)
- 来自autoconf测试的错误编译命令
- 时间限制超出错误C++编译
- SFML 2.3 和 CodeBlocks 错误编译