模板声明顺序在c ++中是否重要

时间:2017-03-12 04:01:27

标签: c++ templates template-specialization

以下代码取自http://www.gotw.ca/publications/mill17.htm

#include<iostream>
using namespace std; 

template<class T> // (a) a base template 
void f( T ){
  cout << "base1\n";   
}

template<class T> // (b) a second base template, overloads (a) 
void f( T* ){
  cout << "base2\n";   
}

template<>        // (c) explicit specialization of (b) 
void f(int*){
  cout << "base3\n";   
}

int main()
{
  int *p = NULL; 
  f( p ); 
}

上述情况下的输出为“base3”。但如果我在(b)上面写(c),则输出为“base2”。我在cpp.sh上测试了上面的代码。谁能告诉我原因?

1 个答案:

答案 0 :(得分:3)

是的,订单在这里很重要。如果你在(b)之前移动(c),那么它变成(a)而不是(b)的显式特化。

在两个主要模板之间的重载分辨率中,即(a)和(b),总是选择(b);但是(c)不再是(b)的特化,然后不会被调用,所以你得到输出“base2”。