我正在尝试编写一个函数,该函数将在给定的任何键和类指针的std :: map上运行,并创建一个新的std :: map,其索引基于函数的返回值。类。本质上,一个模板函数,用于根据其包含的类中的函数重新索引映射。但是,我在尝试调用函数时遇到了编译器错误。
template<class AnyType, class ValueType, class FunctionType>
AssocArray<FunctionType,ValueType> reindex( const AssocArray<AnyType, ValueType>& original, FunctionType (*getterFunction)() ) {
AssocArray<FunctionType, ValueType> ret;
FunctionType index;
for(typename AssocArray<AnyType,ValueType>::const_iterator it = original.begin(); it!=original.end(); it++) {
index = ((*it->second).*getterFunction)();
ret[index] = it->second;
}
return ret;
}
由:
调用floatIndexed = reindex( intIndexed, &test::getB );
其中getB属于float类型。
这会导致编译错误:
src/World.cpp:78:50: error: no matching function for call to ‘reindex(std::map<int, onathacar::test*>&, float (onathacar::test::*)())’
src/World.cpp:78:50: note: candidate is:
./include/Types.h:123:36: note: template<class AnyType, class ValueType, class FunctionType> std::map<PreservedType, ValueType> onathacar::reindex(const std::map<LookupType, ValueType>&, FunctionType (*)())
我尝试了不同的变体,包括使用&#34; FunctionType(ValueType :: * getterFunction)()&#34;并改变&#34; AssocArray&#34;到&#34; AssocArray&#34;。唯一有效的是添加了第四个模板参数:
template<class AnyType, class ValueType, class FunctionType, class SomeType>
AssocArray<FunctionType,ValueType> reindex( const AssocArray<AnyType, ValueType>& original, FunctionType (SomeType::*getterFunction)() ) {
但是,这似乎可能会允许调用实际上不是ValueType成员的函数,因此我更喜欢其他选项。我甚至不确定出了什么问题,因为看起来模板匹配,至少添加了&#34; ValueType ::&#34;。为什么调用与模板不匹配,有没有办法在没有第四个模板类型的情况下修复它?
有关更多背景信息,请Header Containing Implementation和Calling Function。
答案 0 :(得分:0)
您似乎尝试将rindex()
函数用于成员,但声明您的函数使用非成员。这不行。这不起作用的原因是您需要一个对象来访问类的函数或数据成员。
答案 1 :(得分:0)
你有两个问题。第一个是reindex
意味着值类型是值,但是您将它们用作指针:
AssocArray<float, test*> floatIndexed;
floatIndexed = reindex( intIndexed, &test::getB );
第二个是reindex
的第二个参数需要声明为成员函数,而不是自由函数。所以reindex
应该是这样的:
template<class AnyType, class ValueType, class FunctionType>
AssocArray<FunctionType,ValueType *> reindex( const AssocArray<AnyType, ValueType *>& original, FunctionType (ValueType:: *getterFunction)() ) {
AssocArray<FunctionType, ValueType*> ret;
FunctionType index;
for(typename AssocArray<AnyType,ValueType*>::const_iterator it = original.begin(); it!=original.end(); it++) {
index = ((*it->second)->*getterFunction)();
ret[index] = it->second;
}
return ret;
}
答案 2 :(得分:0)
template<class A, class B>
class X{
public:
};
class Y{
public:
int func() { return 42; }
};
template<class A, class B, class C>
X<C,B> reindex( const X<A, B>& original, C (B::*getterFunction)() ) {
X<C, B> x2;
cout << "hello" << endl;
return x2;
}
int main() {
X x1;
reindex(x1,&Y::func);
return 0;
}
这有效,并提供完全有效的结果。
你调用AssocArray intIndexed的问题是,你试图将&amp; test :: getB作为getter函数传递,它假设valueType = test,其中你的实际值类型是test *。