模æ¿çš„显å¼å®žä¾‹åŒ–

时间:2015-09-22 02:38:49

标签: c++ templates

This thread确实很有帮助,但我ä»ç„¶å¯¹æ­¤è¿‡ç¨‹æœ‰ç–‘问,似乎没有得到解答。

我必须在多大程度上明确地实例化模æ¿ï¼Ÿä¾‹å¦‚,如果在我的定义文件中我在æ¯ä¸ªå‡½æ•°ï¼Œæœ‹å‹ç±»ï¼Œè¿ç®—符é‡è½½ç­‰ä¸Šä½¿ç”¨æ¨¡æ¿ï¼Œæˆ‘必须在模æ¿å®žä¾‹åŒ–文件(我正在使用的当å‰æ–¹æ³•ï¼‰ä¸­å®žä¾‹åŒ–æ¯ä¸ªæ¨¡æ¿å—?

æ ¹æ®æˆ‘çš„åå¤è¯•éªŒï¼Œç­”案似乎是å¦å®šçš„,那就是一个简å•çš„

template class Class<type>;

将适用于所有ç­çº§æˆå‘˜ã€‚但是,我已阅读其他建议的代ç ï¼Œå¹¶å°†éžå¸¸æ„Ÿè°¢å…·ä½“的答案。

1 个答案:

答案 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>生æˆä»£ç ã€‚

唯一的问题是,为了使用这样的代ç éšè—,我们必须显å¼å®žä¾‹åŒ–我们想è¦ä½¿ç”¨å®ƒçš„所有类型的函数,å¦åˆ™æˆ‘们会得到链接器错误。