1. 程式人生 > >可否把模板的標頭檔案和原始檔分開編譯

可否把模板的標頭檔案和原始檔分開編譯

    嚴格意義上說,不行,不過可以通過巧妙的手段解決這問題。

//-------------test.h----------------//
template<class T>
class A
{
  public:
  void f(); // 這裡只是個宣告
};

//---------------test.cpp-------------//
#include”test.h”
template<class T>
void A<T>::f()  // 模板的實現
{
  …//do something
}
 
//---------------main.cpp---------------//
#include”test.h”
int main()
{
  A<int> a;
  f(); // #1
}

說白了 就是函式模板也好、類模板也罷,在編譯的時候例項化為函式定義(能不能例項化要看編譯器是否能遇讓模板例項出來 的語句)。而跨檔案函式呼叫是在連結的時候才去找例項化之後 的函式。由於標頭檔案僅作為宣告模板類或者函式的地方。相應的CPP僅僅作為實現的地方的話,那麼是不會觸發其例項化的,也就是這個CPP對應的.OBJ檔案中沒有具體的函式資訊。這就是個麻煩了。

那如何解決呢?

兩種思路,暫時沒想到其它的

  第一種是讓模板知道main函式是如何呼叫他的,那麼需要把模板的定義放到標頭檔案中去,然後main函式的cpp包含這個標頭檔案中即可。但是如果多個類、都用了這個方法,那麼在編譯的時候會產生重複定義的問題,類似我上一篇文章

全域性變數能不能放到標頭檔案中宣告

  另外一種思路是,讓.h共享.cpp的資訊,即在.h中增加#include<.cpp>,但是這種.h包含.cpp的做法是否嚴謹呢。

還有一種辦法,就是既然無法連結是因為編譯的時候沒有經過呼叫生成類例項,那麼能否通過獨立的函式來呼叫這個類或者函式 來生成一個呢。也可以,但是依然面對著第一種做法的重複定義的風險。

相關推薦

可否模板檔案原始檔分開編譯

    嚴格意義上說,不行,不過可以通過巧妙的手段解決這問題。//-------------test.h----------------// template<class T> class A { public: void f(); // 這裡只是個宣告

C++中為什麼要檔案原始檔分開寫呢?

對c&c++程式來說,基本上來說都是要把原始檔和標頭檔案分別編寫。一般都是代表一個基本功能的原始檔引用相應的標頭檔案。 一個 相關功能的模組可能有若干對原始檔和標頭檔案組成。這是基於元件程式設計的核心。 在我看來,他的好處是巨大的,是java不可比擬的,也是

檔案原始檔工程構建CMakeLists寫法

1.最簡單的CMakeLists.txt如下,只有一個原始檔: cmake_minimum_required (VERSION 2.6) #版本要求 project (Tutorial) #工程名稱 add_executable(

C語言中,檔案原始檔的關係(轉)

//a.h void foo(); //a.c #include "a.h"   //我的問題出來了:這句話是要,還是不要? void foo() {      return; } //main.c #include "a.h" int main(int argc

C語言中,檔案的作用,檔案原始檔的關係(轉)

簡單的說其實要理解C檔案與標頭檔案(即.h)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程: 1.預處理階段  2.詞法與語法分析階段  3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案 (.obj檔案) 4.連線階段,將各個目標檔

C++檔案原始檔的關係以及makefile檔案

背景 因為函式之間需要相互引用,寫入一個檔案顯得雜亂。寫入不同檔案,引用和編譯也很麻煩。故用標頭檔案。 規則 標頭檔案的格式: #ifndef <標頭檔案的名稱> #define <標頭檔案的名稱> <定義的函式&g

C++中的檔案原始檔:如何寫檔案

通常,在一個C++程式中,只包含兩類檔案——.cpp檔案和.h檔案。其中,.cpp檔案被稱作C++原始檔,裡面放的都是C++的原始碼;而.h檔案則被稱作C++標頭檔案,裡面放的也是C++的原始碼。 C+ +語言支援“分別編譯”(separate compilation)。也就是說,一個程式所有的內容,可以分成

C++ 檔案原始檔的解釋

標頭檔案:.h 原始檔:.cpp 原始檔寫函式的定義, 標頭檔案用於寫函式的宣告,包括類裡面的成員和方法的宣告、函式原型、#define常數等,但一般來說不寫出具體的實現,除了宣告也有一些例外,不如static這種,或者只在該函式域起作用的,不過多解釋 在寫標頭檔案時需要

實現C++模板檔案實現檔案分離的方法

如何實現C++模板類標頭檔案和實現檔案分離,這個問題和編譯器有關。 引用<<C++primer(第四版)>>裡的觀點:1)標準C++為編譯模板程式碼定義了兩種模型:“包含”模型和“分別編譯”模型。2)所有編譯器都支援“包含”模型,某些編譯器支援“

徹底搞明白win32程式設計 .h檔案.cpp原始檔關係

一.想把專案的全域性引數都放在一個檔案裡,好方便對初始值修改。 步驟: 1.新建一個.h標頭檔案,只宣告引數為全域性變數(注意是宣告!!!)。 2.一定要extern,這才是宣告全域性變數 而且 一定不能賦初值 extern int a;

Linux中C/C++編譯新增檔案庫路徑方式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

CodeBlocks 17.12 工程如何引用其他資料夾的檔案源程式

假設你的工程名為project,目錄為F:\test。但是你想在project中使用資料夾F:\library下面的一些標頭檔案和源程式。由於這些標頭檔案和源程式與工程project不在同一目錄下面,所以需要做一些設定。下面介紹兩種方法:     1、第一步:在CodeBlocks介面中

【C】stdint.h檔案inttype.h檔案的使用方法

Date: 2018.10.23 1、參考: 2、使用方法     這兩個標頭檔案是C99標準定義的關於型別重定義的,主要目的是實現統一的跨平臺資料定義。但是VC編譯器對C99標準的相容性很差,有

windows下使用gcc完成檔案目標檔案編譯

環境要求 安裝了gcc  win+r然後輸入cmd , dos介面輸入 gcc -v 檢視有沒有安裝gcc   進入正題 新建 text.c檔案鍵入如下程式碼: #include <stdio.h> #include ".\\head.h" int main(

C++ 基礎(三)C++檔案原始檔的使用方法 舉例

看完這篇文章,你就知道怎麼用標頭檔案和原始檔了 http://www.cnblogs.com/fenghuan/p/4794514.html 標頭檔案:常量、變數、函式、類的宣告 原始檔:變數的定義和函式的實現 步驟一、先建立標頭檔案 #ifndef CIRCLE_H #defi

2016.12.21_IAR檔案檔案路徑的問題

IAR的工程路徑和標頭檔案路徑的配置問題。 之前有多次受到這個問題的困擾,為了一勞永逸的解決問題,將可能出現的問題進行了總結。 解決方法: 首先!!注意最重要的,要先把程式複製一份然後再來進行

VS2015建立一個完整的c++工程:檔案.h 原始檔.cpp,自動生成類

開啟VS2015 ,新建VS win32工程,前面步驟很簡單,不再闡述 下面直接開始: 新建一個VC++ win32的程式, 在原始檔加下新增.cpp檔案,一般放main函式 #include <iostream> #include <locale&

Linux檔案庫的搜尋路徑

本文轉自:https://blog.csdn.net/pwl999/article/details/78219374 1.1、glibc安裝時.so庫檔案和.h標頭檔案都安裝到什麼資料夾,gcc怎麼能正確的找到相應的資料夾? 當我們在build gcc時設定–prefix

寫nandflash 注意到的幾個檔案 目錄

1.驅動的目錄            driver/mtd/nand/*.c  下面所有的.c 檔案是與nandflash 驅動編寫相關的     最重要的有兩個:     一. 系統預設的 驅動主體函式 nand_base.c     二.你自己針對需要自己寫的驅動主體函

C++的檔案實現檔案分別寫什麼

http://www.cnblogs.com/ider/archive/2011/06/30/what_is_in_cpp_header_and_implementation_file.html 在C++程式設計過程中,隨著專案的越來越大,程式碼也會越來越多,並且難以管