gpt4 book ai didi

c++ - 在头文件中包含模板实现cpp文件和链接困惑

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:16 24 4
gpt4 key购买 nike

我正在阅读一篇文章 An Idiot's Guide to C++ Templates - Part 2来到Separation of Declaration and Implementation部分。

现在我有三个文件,它们的内容如下:

示例.hpp

#ifndef SAMPLE_HPP
#define SAMPLE_HPP

template <typename T>
void displayValue(T tValue);

#include "sample.cpp"

#endif

示例.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;
}

根据作者的说法,

your project/build now must not add Sample.CPP for compilation process

但是,当我使用时:

g++ main.cpp sample.cpp -o main

它仍然有效!

我认为在这种情况下,对象 sample.o 仍将包含关于模板函数 displayValueNO 代码,并且在 main.o 对象,它包含。所以理论上是没有错误的。但是为什么作者说不能呢?

最佳答案

没有报错是正常的。因为你的定义和实现都算是一个文件。

更好和通常的 C++ 风格是;

头文件(myClass.h):你不应该包含实现文件(编译器会找到它,如果有的话)。实现(myClass.cpp): #include myClass.h

主程序(main.cpp)这还需要 #include myClass.h

如果您使用这种通常的风格实现,您预计会收到链接错误,因为您不应该将模板函数/类的定义和实现分开。

作者可能指的是这个。

关于c++ - 在头文件中包含模板实现cpp文件和链接困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387478/

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