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

C++ 指向char[]类型成员的指针的模板签名,c++,templates,C++,Templates,我已经编写了一个比较器来检查对象的成员是否等于输入。这就像一个符咒,除了一个成员是char[] 我搜索了互联网,C++ ISO标准,试了很多,但我没办法弄明白。 这是简化代码: /* * main.cpp * * Created on: Nov 17, 2012 * Author: martijn */ #include <string.h> class Data { public: Data() { strcpy(Name, "My

我已经编写了一个比较器来检查对象的成员是否等于输入。这就像一个符咒,除了一个成员是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;
}
/*
*main.cpp
*
*创建日期:2012年11月17日
*作者:martijn
*/
#包括
类数据{
公众:
数据(){
strcpy(名称“MyCharArray”);
};
虚拟数据();
字符名[12];
};
模板//这里应该是什么?!
类比较器{
公众:
比较器(){};
~Comparator(){};
};
int main(){
比较器比较器阵列;
返回0;
}
代码中指出了问题区域(至少我是这么认为的)。当前代码不正确。编者说:


错误:无法将模板参数“&Data::Name”转换为“char(Data::*)[]”

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

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是什么。我的传统无法编译的是一个大小为零的数组:如果您的编译器是智能的,请使用
intx[sizeof(T)-sizeof(与测试变量类型相同的表达式)]
,但在一些懒惰的编译器中,只有零可以工作。

使用std::string会简化您的生活吗?出于好奇:您使用这个模式做什么?当然std::string会更简单。但是fortran代码有很多遗留和接口。我需要一个比较器为可能的每个成员在大量的类。因此,我想要一个模板版本的它。给我一个想法,这可能是有用的。在没有遗留代码的情况下,它不希望它在C++架构中有用,但不介意别人告诉它。