簡體   English   中英

C ++模板,傳遞帶有參數化返回類型的函數指針

[英]C++ templating, passing a function pointer with a parameterized return type

我想參數化函數的返回值以匹配我傳遞給它的函數指針的返回值。 我以前只處理過Java泛型,所以很有可能我在這里完全錯過了一些東西。

該函數如下所示:

<in header>
template <typename T> static T getItems(const char* xpath, T (*getThings)(xpath_node_set*));

<in body>
template <typename T>
T XMLAdapter::getItems(const char* cpath, T(*getThings)(xpath_node_set*)){
    return getThings(head.select_nodes(path));
}

我傳遞給它的函數如下所示:

size_t handler(xpath_node_set* in){
    return in->size();
}

我得到的錯誤是:

Error   1   error LNK2019: unresolved external symbol \
"public: static unsigned int __cdecl XMLAdapter::getItems<unsigned int>(char const *,unsigned int (__cdecl*)(class pugi::xpath_node_set *))" (??$getItems@I@XMLAdapter@@SAIPBDP6AIPAVxpath_node_set@pugi@@@Z@Z) \
 referenced in function _wmain  C:\Users\Adam\SkyDrive\Documents\proj\ray\ray\ray.obj   ray

是什么賦予了?

從原型中刪除static元素,它將使您的功能文件成為本地文件(即,其他TU不可見)。

通常,功能模板定義應出現在標題中,而不是單獨的.cpp文件。

模板函數需要在標頭中完全實現(而不只是聲明),否則,如果調用者和模板函數不在同一個.cpp文件中,則會遇到此類鏈接器錯誤。

這樣考慮:在代碼上運行編譯器時,實際上是為每個.cpp文件編譯一個單獨的.obj文件。 從編譯器的角度來看,它們是完全獨立的黑匣子。 每個.cpp文件都可以並行編譯,並且它們之間的依賴性為零。 唯一的依賴關系是函數聲明(在標頭中指定),其中說:“是的,是的...其他人正在實現此聲明,如果鏈接器找不到它,則讓鏈接器抱怨。”

當您擁有模板功能時,您真正要做的就是如何制作功能的秘訣。 如果您有Foo <T>並想用int和string來調用它,那么實際上在最終二進制文件中,有兩個生成的函數在符號上完全不同:Foo <int>和Foo <string>。

就是說,如果您將模板函數的實現與試圖調用它的專用版本的人放在單獨的.cpp文件中,則他們將無法使用他們使用的任何模板參數來“烹飪”該函數的新版本正在供應。 他們只有一個標頭,上面寫着“ Foo <T>是其他人實現的功能”,以安撫鏈接程序。 但是您的TemplateImplementation.cpp無法知道應該生成Foo <int>和Foo <string>。

這就是為什么您總是會看到模板庫作為僅標頭庫提供的原因。 如果有人願意,沒有人會向您提供帶有已編譯模板函數的庫,因為它們只有在您調用特定版本后才能生成這些函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM