2016-11-25 78 views
0

我想在我的dll項目中使用我自己的一些模板類。爲了做到這一點,建議here,我仍然通過包含我的類的頭文件(作爲.inl文件)的定義,將我的類模板聲明從其定義中分離出來。我試圖完成這個類的是我自己的矢量類,它將包裝std :: vector類。下面類設置舉例:模板多重定義問題

Vector.h

#pragma once 
#include <vector> 

namespace BlazeFramework 
{ 
    template<typename type> 
    class Vector 
    { 
    public: 
     Vector(); 
     Vector(int size); 
     ~Vector(); 

    private: 
     std::vector<type> _collectionOfItems; 
    }; 
} 

#include "Vector.inl" 

Vector.inl

#include "Precompiled.h" 
#include "Vector.h" 

namespace BlazeFramework 
{ 
    template<typename type> 
    Vector<type>::Vector() 
    { 
    } 

    template<typename type> 
    Vector<type>::Vector(int size) : _collectionOfItems(_collectionOfItems(size, 0)) 
    { 
    } 

    template<typename type> 
    Vector<type>::~Vector() 
    { 
    } 
} 

當我第一次嘗試這樣做,我得到了錯誤,說: 「函數模板已經被定義」。我想這是由於我的.inl文件包含頂部的「Vector.h」頭,所以我刪除了它。但是,我現在正在收到錯誤,「無法識別的模板聲明/定義」

如何解決此問題,以便我仍然可以將我的類模板定義與它們的聲明分開?

+1

請勿在* .inl文件中包含任何內容。 – tim

回答

1

將定義和實現模板保留在單獨文件中的一種解決方案是明確地將源文件中所需的模板瞬間化。例如:

template class Vector<int>; 
template class Vector<float>; 

在這種情況下,應從頭中刪除#include "Vector.inl"

如果你不喜歡這種方法,你可以堅持到#include。但是,請記住,不應將Vector.inl文件編譯爲常規源。如果確實如此,你會得到一個錯誤類型redefinition of template...

雖然,請記住,一般來說,模板類最好是緊湊的,簡單的,並且被設計爲保存在頭文件中 - 因爲這是compieler用於生成實際類的提示。

我建議閱讀下面的帖子的題目是:

廣告從理論上講,你可能應該看看構造函數中的初始化列表 - 似乎是不正確的。

+0

感謝您的鏈接!你好,我很快就做到了。不是100%確定我的類的構造函數應該如何用std :: vector設置。 – Jason

+0

你可以簡單地寫':_collectionOfItems(size,0)' - 而不是嵌套成員 – Dusteh