在下面的代码中,我试图专门研究FieldCompare模板
struct A
{
size_t key;
};
template <class T, class Field, Field T::*field_ptr>
class FieldCompare
{
};
template <class T, class Field, Field T::*field_ptr>
class FieldCompare<T *, Field, field_ptr>
{
};
int main()
{
FieldCompare<A *, size_t, &A::key> comp;
return 0;
}
但是在“创建指向非类类型'T *'的成员的编译器时出错”。
此代码有什么问题?
EDIT1:
请参阅life example我正在尝试做的事情。例如,它是比较器的一种专门用于std :: set和std :: set
答案 0 :(得分:3)
这里的问题是,当T
是指针时,您无法识别T::*ptr
到T
的成员。但是,有了<type_traits>
标头,您可以通过以下方式使用基本模板来解决此问题:
#include <type_traits>
template <class T, class Field, Field std::remove_pointer_t<T>::*field_ptr>
class FieldCompare
{ /* ... */ };
和专业版本
template <class T, class Field, Field std::remove_pointer_t<T>::*field_ptr>
class FieldCompare<T*, Field, field_ptr>
{ /* ... */ };
仅将std::remove_pointer_t
包含在部分专业化中是行不通的,因为这不是专业化。