我已经通过 VS2010 运行了以下代码。
#include <iostream>
template<class T> // (a) a base template
void f( T )
{ std::cout << "(a)" << std::endll;}
template<class T> // (b) a second base template, overloads (a)
void f( T* ) // (function templates can't be partially
{ std::cout << "(b)" << std::endll;}
template<> // (c) explicit specialization of (b)
void f<>(int*)
{ std::cout << "(c)" << std::endll;}
int main(int argc, char* argv[])
{
int *p = new int(10);
f( p ); // '(c)'
return 0;
}
////////////////
#include <iostream>
template<class T> // (a) same old base template as before
void f( T )
{ std::cout << "(a)" << std::endll;}
template<> // (c) explicit specialization, this time of (a)
void f<>(int*)
{ std::cout << "(c)" << std::endll;}
template<class T> // (b) a second base template, overloads (a)
void f( T* )
{ std::cout << "(b)" << std::endll;}
int main(int argc, char* argv[])
{
int *p = new int(10);
f( p ); // '(b)'
return 0;
}
输出结果为(c)
。但是,如果我将 (c) 代码块移动到 (b) 前面,则输出结果为(b)
. 我在这里阅读了相关文章http://www.gotw.ca/publications/mill17.htm。还是会糊涂。
为什么代码的顺序在案例中很重要?