2

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

我已经搜索了互联网,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;
}

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

错误:无法将模板参数 '&Data::Name' 转换为 'char (Data::*)[]'</p>

4

2 回答 2

3

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

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();
于 2012-11-27T08:54:03.157 回答
0

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

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

于 2012-11-27T12:55:35.373 回答