'创建指向非类类型'T *'成员的指针的编译器错误

时间:2019-07-28 18:32:28

标签: c++ c++17

在下面的代码中,我试图专门研究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

1 个答案:

答案 0 :(得分:3)

这里的问题是,当T是指针时,您无法识别T::*ptrT的成员。但是,有了<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包含在部分专业化中是行不通的,因为这不是专业化。