Before I met some questions about the template special case, I summarize.
Template exceptions are a feature of the new C + + standard that allows you to customize the implementation of certain templates, such as the comparison function compare can use the Less<t> Standard Library template to compare types such as String, int, char, pointer, and so on, but if there is a const char* Type and compare the dictionary size of a string, it is different from the previous comparison:
#ifndef A_H#define A_H#include <iostream> #include <cstring>using std:: Less;template <typename t>int compare (CONST&NBSP;T&NBSP;V1,CONST&NBSP;T&NBSP;V2) { if (Less<t> () (V1,V2)) { return -1; } else if (Less<t> () (V2,V1)) { return 1; } else { return 0; }}template <>inline int compare (const char *const a,const char *const b) { &NBSP;&NBSP;&NBSP;RETURN&NBSP;STRCMP (A, b);} #endif #include "A.H" Using std::cout;using std::endl;int main () {&Nbsp; cout << compare ( << endl; ) cout << compare ("123", "ASD") << endl; return 0;}
Now it looks fine, and only these two files are compiled and run correctly, if you have a file containing a.h a.cpp:
#include "A.h"
There is only one sentence, but the inclusion of the A.h file means that the definition of its template function is included, and the function of the exception is similar to a normal function, then A.cpp, Main.cpp contains multiple definitions of the same function, so there is a redefinition problem when linking.
Workaround:
When using inline inline to declare special templates, the definition of some functions can be contained in multiple files (implementations of some functions may not support inline):
Template <>inline int compare (const char *a,const char *b) {return strcmp (A, b);}
The other one is to use a file containing the header file, so that all linked files have only one exception definition
The third is to define a function with the same name, calling the non-template function by overloading (at the same time as the parameter match level, the non-template overloaded function overrides the call)
a.h#ifndef A_H#define A_H#include <iostream> #include <cstring>using std::less;template <typename t>int compare (const t v1,const t V2) { if (less<t> () (V1,V2)) { return -1; } else if ( Less<t> () (V2,V1)) { return 1; } else { return 0; }}int compare (const char *a,const CHAR&NBSP;*B) ;// a.cpp#include "A.h" Int compare (const char *a, const CHAR&NBSP;*B) { std::cout << "const char*" <<std::endl; retURN&NBSP;STRCMP (A, b);} main.cpp Same
If there is any other way, please communicate with us.
This article is from the "zmh009" blog, make sure to keep this source http://zmh009.blog.51cto.com/11619347/1883801
Special-Case Compilation of C + + templates to multiple definition issues