0

是否可以显式实例化模板函数的一个或多个特化?其次,函数是否是类成员有关系吗?它是否合法 C++11 并且是否被编译器接受,所以它不会出现问题?

4

1 回答 1

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。

于 2013-06-19T16:21:46.990 回答