我读了书
(1)这是我的简单模板:
#includetemplate void Function(const T& a) { std::cout << "Function : " << a << std::endl; } template void Function (const T* a) { std::cout << "Function : " << a << std::endl; } int main(void) { Function(1); Function(1.2); Function("hello"); Function((void*)0x25); return 0; }
我使用ubuntu16.04 x64,g ++ 5.3,编译器报告:
$ g++ main.cpp -o main.exe main.cpp:10:29: error: non-type partial specialization ‘Function’ is not allowed void Function (const T* a)
(2)但这段代码是正确的:
#includetemplate void Function(const T& a) { std::cout << "Function : " << a << std::endl; } int main(void) { Function(1); Function(1.2); Function("hello"); Function((void*)0x25); return 0; }
结果显示:
$ g++ main.cpp -o main.exe $ ./main.exe Function: 1 Function : 1.2 Function : hello Function : 0x25
我的问题是:关于指针专业化的书是错的吗?或者我误解了书中这一部分的含义?或者是其他东西 ?
关于类中指针特化的更新.
(3)带指针特化的模板类:
#includetemplate struct Base { T member; Base(const T& a) : member(a) { } void hello() { std::cout << member << std::endl; } }; template struct Base { T* member; Base(T* a) : member(a) { } void hello() { std::cout << member << std::endl; } }; int main(void) { Base b1(12); Base b2(2.4); Base b3("hello"); Base b4((void*)0x25); b1.hello(); b2.hello(); b3.hello(); b4.hello(); return 0; }
这个代码是正确的,有一个警告:
$ g++ main.cpp -o main.exe main.cpp: In function ‘int main()’: main.cpp:37:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] Baseb3("hello"); ^ $ ./main.exe 12 2.4 hello 0x25
(4)没有指针专门化的模板类:
#includetemplate struct Base { T member; Base(const T& a) : member(a) { } void hello() { std::cout << member << std::endl; } }; int main(void) { Base b1(12); Base b2(2.4); Base b3("hello"); Base b4((void*)0x25); b1.hello(); b2.hello(); b3.hello(); b4.hello(); return 0; }
结果是一样的:
$ g++ main.cpp -o main.exe main.cpp: In function ‘int main()’: main.cpp:39:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] Baseb3("hello"); ^ $ ./main.exe 12 2.4 hello 0x25
这是否意味着指针专业化是不必要的?或者这个功能在不同的编译器上表现不同?
正如您已经被告知的那样,不允许对函数模板进行部分特化.你可以使用std::enable_if
这个:
template::value>* = 0> void func(T val) { std::cout << val << std::endl; } template ::value>* = 0> void func(T val) { func(*val); }
如果您正在寻找更简单的语法,请等待概念
错误消息告诉您出了什么问题:
non-type partial specialization ‘Function’ is not allowed
您只能部分专门化类型(类)。您尝试了部分专门化功能。函数不是类型;您只能完全专门化它们。