2017-02-10 45 views
0

是否將模板函數的主體放置在頭文件或其相應的cpp文件中?爲什麼?標題或cpp中的模板函數體

我有一些代碼,我稍微修改了一下,這要感謝Nikos Athanasiou所寫的答案,在this線程上找到並在下面看到。目前,我在一個頭文件中包含以下所有代碼。

我已經閱讀了那裏的主題,解釋瞭如何在cpp文件中的頭文件和模板函數體中使用模板函數定義,但是我想知道哪個會被認爲是正確的。這兩種選擇都有哪些表現優缺點?

typedef std::chrono::duration<float> fsec; 

template<typename F, typename... Args> 
float ftime_fsec(F func, Args&&... args){ 
    auto t1 = std::chrono::high_resolution_clock::now(); 
    func(std::forward<Args>(args)...); 
    return std::chrono::duration_cast<fsec> 
     (std::chrono::high_resolution_clock::now() - t1).count(); 
} 
+0

如果是模板方法,您必須將其保存在頭文件中。在它以某種方式實例化之前,它不能被渲染成機器代碼。這就是編譯器知道具體實現將會是什麼樣子的時候了。 – tadman

+1

[爲什麼模板只能在頭文件中實現?]可能重複(http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) – Amadeus

+0

我看到那個線程;然而,線程明確提到你不需要將實現放在頭文件中,並且相同的答案提供了一個解決方案,以便將它放在cpp文件中。我的問題是更多的天氣或不是適當的,甚至值得將實現移動到cpp文件。謝謝! – hbchevelle68

回答

1

這絕對是正確的把它變成一個頭文件。這是爲了避免輸入冗餘代碼,它也被用作編譯器的一種「指南」的聲明。它實際上並沒有在對象意義上定義任何東西,它只是爲指定類型的後續定義提供指導。