2013-06-19 58 views
0

是否可以显式实例化模板函数的一个或多个专业化?第二,这个函数是否是类成员是否重要? 它是合法的C++ 11,它也被编译器接受,所以它不会出现问题吗?C++模板函数:显式实例化一个或多个专业化

+0

您是否阅读过约翰内斯的回答[此问题](http://stackoverflow.com/questions/5512910/explicit-specialization-of-template-class-member-function?rq=1),我认为非常接近你的要求(至少是第二部分)。 – WhozCraig

回答

1

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

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

对于一个给定的模板参数,如果一个模板的显式实例化一个明确的专业化应该是一个声明后出现模板,显式实例化不起作用。


其次,它的问题如果该函数是一个类的成员?

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

的类,函数或构件模板特殊化可以明确地从它的模板实例化。 类模板的成员函数,成员类或静态数据成员可以从与其类模板关联的成员定义中显式实例化。类模板的函数模板或成员函数的显式实例化不应使用inline或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。