指向 char[] 类型的成员的指针的模板签名

template signature for pointer-to-member of type char[]

本文关键字:指针 成员 类型 指向 char      更新时间:2023-10-16

我写了一个比较器来检查对象的成员是否等于输入。这就像一个魅力,除了一个成员是一个字符[];

我搜索了互联网,C++ISO标准并尝试了很多,但我无法弄清楚。

这是简化的代码:

/*
 * main.cpp
 *
 *  Created on: Nov 17, 2012
 *      Author: martijn
 */
#include <string.h>
class Data {
public:
    Data() {
        strcpy(Name, "MyCharArray");
    };
    virtual ~Data();
    char Name[12];
};
template <class ClassT, char (ClassT::*Name)[]> // What should be here?!
class Comparator {
public:
    Comparator() {};
    ~Comparator() {};
};
int main() {
    Comparator<Data, &Data::Name> comparatorArray;
    return 0;
}

问题区域(至少我是这样认为的)在代码中指示。当前代码不正确。编译器说:

错误:无法将模板参数"&数据::名称"转换为"字符(数据::*)[]"

您需要在模板参数类型中指定数组绑定:

template <class ClassT, char (ClassT::*Name)[12]>

或者可能:

template <class ClassT, std::size_t N, char (ClassT::*Name)[N]>

并使用:

// Note, this is a declaration of a function, is this correct?
Comparator<Data, 12, &Data::Name> comparatorArray();

回答此类问题的一种简单方法是使用编译器错误消息。

使用泛型参数创建一个模板函数,该参数在传递参数时明显无法编译。 然后查看错误消息,它通常会告诉您T是什么。 我传统的编译失败是一个大小为零的数组:如果你的编译器很聪明,使用int x[sizeof(T)-sizeof(expression with the same type as your test var)]但只有一个零可以在一些懒惰的编译器中工作。