C ++模板函数:显式实例化一个或多个特化

时间:2013-06-19 15:53:13

标签: c++ templates

是否可以显式实例化模板函数的一个或多个特化? 其次,如果函数是类成员,这是否重要? 它是合法的C ++ 11还是被编译器接受,所以它没有问题吗?

1 个答案:

答案 0 :(得分:1)

  

是否可以显式实例化模板函数的一个或多个特化?

是的,但是, [temp.explicit] / 5:

  

对于给定的模板参数集,如果在声明该模板的显式特化之后出现模板的显式实例化,则显式实例化无效。


  

其次,如果函数是类成员是否重要?

不,AFAIK; [temp.explicit] / 1:

  

可以从其模板中显式实例化类,函数或成员模板特化。 类模板的成员函数,成员类或静态数据成员可以从与其类模板关联的成员定义中显式实例化。函数模板或类模板的成员函数的显式实例化不应使用内联或constexpr说明符。

来自[temp.explicit] / 3的示例:

template<class T> class Array { void mf(); };
template class Array<char>;

template void Array<int>::mf();

template<class T> void sort(Array<T>& v) { /∗ ... ∗/ }
template void sort(Array<char>&);    // argument is deduced here

namespace N {
template<class T> void f(T&) { }
}
template void N::f<int>(int&);

  

它是合法的C ++ 11还是被编译器接受,所以它没有问题吗?

嗯,是的,但对于图书馆来说,总是存在ABI兼容性的问题;特别是如果不同的编译器已经用于库和库用户(例如包括该库的程序)。 C ++标准没有指定ABI。