我写了一个比较器来检查对象的成员是否等于输入。这就像一个魅力,除了一个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 :: *)[]'
答案 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)]
但只有零可以在一些惰性编译器中工作。