C++ c++;函数中的模板

C++ c++;函数中的模板,c++,templates,C++,Templates,我想做一个通用数组函数。在我的API中,我有一个泛型容器,我需要将它转换为正确的类,但我想使它成为泛型的 template<class T> void UT::printArray(CCArray* arr, T type) { CCObject *aIt = NULL; CCARRAY_FOREACH(arr,aIt ) { T *aElm = static_cast<T*>(aIt ); int col =

我想做一个通用数组函数。在我的API中,我有一个泛型容器,我需要将它转换为正确的类,但我想使它成为泛型的

template<class T>
void UT::printArray(CCArray* arr, T type)
{
    CCObject *aIt = NULL;  
    CCARRAY_FOREACH(arr,aIt )
    {
        T *aElm = static_cast<T*>(aIt );
        int col = aElm ->getColNum(); 
        int row = aElm ->getRowNum();
        CCLOG("col:%d row:%d",col,row);
    }
}
模板
无效UT::打印阵列(CCArray*arr,T类型)
{
cObject*aIt=NULL;
CCARRAY_FOREACH(arr、aIt)
{
T*aElm=静态铸件(aIt);
int col=aElm->getColNum();
int row=aElm->getRowNum();
CCLOG(“列:%d行:%d”,列,行);
}
}

这不是正确的编译,而且每次调用这个函数时我都需要创建新的T对象。什么是正确的方法?

当然我不知道你的
cArray
是什么,但我可以修改你的功能:

template<class T>
void UT::printArray(CCArray* arr)
{
    CCObject *aIt = NULL;  
    CCARRAY_FOREACH(arr,aIt )
    {
        T *aElm = static_cast<T*>(aIt );
        int col = aElm ->getColNum(); 
        int row = aElm ->getRowNum();
        CCLOG("col:%d row:%d",col,row);
    }
}
模板
void UT::printary(CCArray*arr)
{
cObject*aIt=NULL;
CCARRAY_FOREACH(arr、aIt)
{
T*aElm=静态铸件(aIt);
int col=aElm->getColNum();
int row=aElm->getRowNum();
CCLOG(“列:%d行:%d”,列,行);
}
}
我已经删除了您的第二个
T type
参数。您可以显式地调用它作为
printary(arr)
,而不是从(未使用的)参数中推断出
T


正如有人在评论中所说,最好的解决方案是阅读有关迭代器的内容,并使您的
CCArray
返回正确的
begin()
end()
,然后您可以使用许多标准算法(例如
sort
)针对容器。

您是否考虑过将迭代器传递给函数而不是实际的容器本身?不,我没有,为什么,如何传递?仅供参考,这是一个cocos2d问题。这个概念是他们工具包的一部分,不,让很多人懊恼的是,迭代器习惯用法并不是他们的使命声明的一部分(显然)。@WhozCraig:即使你不能成为
CCArray
的新成员,你仍然可以实现和使用迭代器。只需定义
begin(CCArray*)
end(CCArray*)
即可返回新的
MyCCArrayIterator
类型的对象。该类具有对数组的引用和访问该数组的内部状态。它的
操作符*
遵从引用数组中的访问器。谢谢,这个函数的头语句应该如何?它给了我链接错误:错误LNK2019:未解析的外部符号“public:void\u thiscall UT::printArray(类cocos2d::CCArray*)”($printArray@VGem@@@UT@@QAEXPAVCCArray@cocos2d@@@Z)在函数“public:void _thiscall GameController::FillGemFromUpperHorizontal(类cocos2d::CCArray*)”中引用(?FillGemsFromAboveHorizontal@GameController@@QAEXPAVCCArray@cocos2d@@@Z) 1>D:\dev\test.win32.exe:致命错误LNK1120:1未解决externals@user63898这是一个模板。它属于写入的头文件。在cpp文件中使用它,但将其放在标题中。().