我正在閱讀文章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,您可能剛剛在頭文件中實現了它的功能,但它的工作原理可能會有問題。 –