This thread确实很有帮助,但我ä»ç„¶å¯¹æ¤è¿‡ç¨‹æœ‰ç–‘问,似乎没有得到解ç”。
我必须在多大程度上明确地实例化模æ¿ï¼Ÿä¾‹å¦‚,如果在我的定义文件ä¸æˆ‘在æ¯ä¸ªå‡½æ•°ï¼Œæœ‹å‹ç±»ï¼Œè¿ç®—符é‡è½½ç‰ä¸Šä½¿ç”¨æ¨¡æ¿ï¼Œæˆ‘必须在模æ¿å®žä¾‹åŒ–文件(我æ£åœ¨ä½¿ç”¨çš„当å‰æ–¹æ³•ï¼‰ä¸å®žä¾‹åŒ–æ¯ä¸ªæ¨¡æ¿å—?
æ ¹æ®æˆ‘çš„åå¤è¯•éªŒï¼Œç”案似乎是å¦å®šçš„,那就是一个简å•çš„
template class Class<type>;
将适用于所有ç级æˆå‘˜ã€‚但是,我已阅读其他建议的代ç ,并将éžå¸¸æ„Ÿè°¢å…·ä½“çš„ç”案。
ç”案 0 :(得分:2)
通常,您ä¸éœ€è¦æ˜¾å¼å®žä¾‹åŒ–模æ¿ï¼Œåªéœ€åœ¨å¤´æ–‡ä»¶ä¸å®šä¹‰å®ƒå¹¶åŒ…å«è¯¥å¤´æ–‡ä»¶å³å¯ã€‚但是,显å¼æ¨¡æ¿å®žä¾‹åŒ–的常è§åº”用是当您想è¦éšè—&#34;模æ¿çš„定义。想象一下以下情况,为简å•èµ·è§ï¼Œæˆ‘们éšè—了模æ¿å‡½æ•°çš„实现:
<强> header.h 强>
template<class X> void f(); // declaration
<强> header.cpp 强>
#include "header.h"
template<class X> void f(){ /* definition */ }
template void f<int>(); // explicit instantiation for int, force the compiler to generate code
template void f<double>(); // explicit instantiation for double, same
<强> 的main.cpp 强>
#include "header.h"
int main()
{
f<int>(); // OK
f<double>(); // also OK
f<char>(); // linker error
}
æ£å¦‚您所看到的,函数f
在header.cpp
文件ä¸å®šä¹‰ï¼ˆå¹¶ä¸”header.h
ä¸çš„ä¸æ˜¯ï¼‰ï¼Œå› æ¤éšè—了用户。由于int
å’Œdouble
的显å¼å®žä¾‹åŒ–,编译器在编译f<int>()
时将能够找到f<double>();
å’Œmain.cpp
的代ç 。但是,在编译f<char>();
æ—¶å°è¯•æŸ¥æ‰¾main.cpp
的代ç æ—¶ï¼Œä¼šå‡ºçŽ°é“¾æŽ¥å™¨é”™è¯¯ã€‚è¿™æ˜¯å› ä¸ºç¼–è¯‘æ˜¯ç‹¬ç«‹å®Œæˆçš„,当编译器编译header.cpp
时,编译器åªç”Ÿæˆf<int>
å’Œf<double>
的代ç ,并且ä¸çŸ¥é“我们会调用f<char>
ï¼Œå› æ¤å®ƒä¸ä¼šä¸ºf<char>
生æˆä»£ç 。
å”¯ä¸€çš„é—®é¢˜æ˜¯ï¼Œä¸ºäº†ä½¿ç”¨è¿™æ ·çš„ä»£ç éšè—,我们必须显å¼å®žä¾‹åŒ–我们想è¦ä½¿ç”¨å®ƒçš„所有类型的函数,å¦åˆ™æˆ‘们会得到链接器错误。