gpt4 book ai didi

c++ - 使用函数指针作为参数匹配模板失败

转载 作者:太空宇宙 更新时间:2023-11-04 14:18:43 24 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数将对给定的任何键和类指针的 std::map 进行操作,并创建一个新的 std::map,其索引基于函数的返回值类(class)。本质上,一个模板函数可以根据其包含的类中的函数重新索引 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 (*)())

我尝试了不同的变体,包括使用“FunctionType (ValueType::*getterFunction)()”并将“AssocArray”更改为“AssocArray”。唯一有效的添加了第四个模板参数:

template<class AnyType, class ValueType, class FunctionType, class SomeType>
AssocArray<FunctionType,ValueType> reindex( const AssocArray<AnyType, ValueType>& original, FunctionType (SomeType::*getterFunction)() ) {

但是,这似乎可能允许调用实际上不是 ValueType 成员的函数,因此我更喜欢其他选项。我什至不确定哪里出了问题,因为看起来模板匹配,至少添加了“ValueType::”。为什么调用与模板不匹配,有没有办法在没有第四种模板类型的情况下修复它?

有关更多上下文,Header Containing ImplementationCalling Function .

最佳答案

你有两个问题。第一个是 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;
}

关于c++ - 使用函数指针作为参数匹配模板失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9236257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com