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

时间:2012-11-27 08:48:50

标签: c++ templates

我写了一个比较器来检查对象的成员是否等于输入。这就像一个魅力,除了一个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;
}

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

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

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