我正在阅读文章An Idiot's Guide to C++ Templates - Part 2并来到Separation of Declaration and Implementation部分。在头文件中包含模板实现cpp文件和链接混淆
现在我有三个文件及其内容如下:
sample.hpp
#ifndef SAMPLE_HPP
#define SAMPLE_HPP
template <typename T>
void displayValue(T tValue);
#include "sample.cpp"
#endif
sample.cpp的
#include <iostream>
template <typename T>
void displayValue(T tValue){
std::cout<<tValue<<std::endl;
}
的main.cpp
#include "sample.hpp"
int main(void) {
displayValue(20);
displayValue(3.14);
return 0;
}
据笔者,
项目/现在打造不得添加sample.cpp的编译过程
但是相反,当我使用:
g++ main.cpp sample.cpp -o main
它仍然有效!
我认为在这种情况下,对象sample.o
仍然包含NO代码有关模板功能displayValue
,并在main.o
对象,它包含的内容。所以理论上没有错误。但为什么作者说must not
?
作者当然不是只谈论gcc,我们也不能说其他编译器会如何表现。如果你再次链接之前链接的东西会出现错误 –
@MaduraAnushanga是的,我还注意到作者正在使用MSVC编译器。我只需要确认,如果我们错误地将'sample.cpp'添加到编译文件中并且不会发生链接错误,那么就没有任何危害。如果作者只谈论MSVC,那么我猜这是编译器的一个缺陷;但我不确定。 –
这取决于你使用的编译器,作者已经说明了最佳实践。我更喜欢在头文件中不包含cpps,您可能刚刚在头文件中实现了它的功能,但它的工作原理可能会有问题。 –