2013-02-09 94 views
0

我有一個帶有構造函數的模板類,它只接受一個參數;一個指向第二個模板類型參數的函數的函數指針。並返回第一個模板類型的元素。在C++類構造函數中的函數指針

下面的代碼:

cache_controller.hpp:

template<class TYPE, class KEY> 
class cache 
{ 
    private: 
     TYPE (*create_func)(KEY); 
    public: 
     cache(TYPE (*func)(KEY)); 
}; 

extern sf::Texture * create_texture(std::string path); 

cache_controller.cpp:

template<class TYPE, class KEY> 
cache<TYPE, KEY>::cache(TYPE (*func)(KEY)) 
{ 
    this->create_func = func; 
} 

sf::Texture * create_texture(std::string path) 
{ 
    sf::Texture * tex_p = new sf::Texture; 
    tex_p->loadFromFile(path); 
    return tex_p; 
} 

測試代碼:

cache<sf::Texture *, std::string> tcache(&create_texture); 

然而,當我聯繫我得到這個錯誤R:

[Linker error] main.cpp:11: undefined reference to `cache<sf::Texture*, std::string>::cache(sf::Texture* (*)(std::string))' 

當然,如果存在實現與arbitary鍵,值和創造功能我洗耳恭聽的對象緩存,任何更簡單的方法。

+0

請注意,將模板參數以相反方式放置會更常見,類似於std :: map或其他關聯容器:'cache '(key = >值) – leemes 2013-02-09 14:05:54

回答

3

您提供了.cpp文件中模板類的成員函數的定義。

的那些成員函數的定義必須是編譯器在實例化點(即,從.cpp文件調用這些函數)可見,否則只有自己聲明可以看出,編譯器將僅僅依靠該功能在其他地方定義,同時處理不同的翻譯單元。

由於在編譯器可以看到其定義的翻譯單元(即.cpp文件)中沒有該函數的實例化,所以不會生成任何實例,並且鏈接器最終會抱怨沒有提供定義。

你應該把cache的構造函數的定義放在定義類模板cache的頭文件中(在你的例子中爲cache_controller.hpp)。

+0

我是一個忘了那個白癡。謝謝。 – Mloc 2013-02-09 14:02:36

+1

@Mloc:不用擔心,我們都在那裏。 – 2013-02-09 14:02:57

2

模板化方法的實現必須與保存其聲明的文件一致。模板實例化是編譯時操作,而不是鏈接時間。將兩者互相合並,以解決鏈接器錯誤。也就是說,在類或外部實現構造函數,但在同一個文件中。