C++编译器误将模板函数尖括号识别为二元<运算符报错如何解决
问题原因
你遇到的是C++模板的「依赖名称模板成员调用」语法问题:GenericChunkAllocator本身是模板类,其静态成员sm_arrayOfStacks的类型ArrayOfStacks<stackSizes...>依赖于当前模板的参数包stackSizes,属于依赖类型。当你调用依赖类型的模板成员函数时,编译器无法默认识别<是模板参数分隔符,只会当成二元小于运算符处理,因此抛出你遇到的报错。
修复方法
调用依赖类型的模板成员函数时,在函数名前加template关键字即可,修改foo函数内的两行代码:
template<int allocatorID, double defaultFillPercentage, size_t... stackSizes> void GenericChunkAllocator<allocatorID, defaultFillPercentage, stackSizes...>::foo() { typedef GenericChunkAllocator<allocatorID, defaultFillPercentage, stackSizes...> thisT; // 加template关键字标记后续<为模板参数分隔符 thisT::sm_arrayOfStacks.template push<0>(nullptr); thisT::sm_arrayOfStacks.template pop<0>(); }
同理你注释掉的allocate函数内的相关调用也要改成:
void* ptr = thisT::sm_arrayOfStacks.template pop<ptrSize>();
额外注意点
你当前的静态成员定义写法有问题,现在是定义了全局的sm_arrayOfStacks,而非GenericChunkAllocator的类静态成员,需要补充类作用域前缀:
template<int allocatorID, double defaultFillPercentage, size_t... stackSizes> awmms::memoryManagement::ArrayOfStacks<stackSizes...> GenericChunkAllocator<allocatorID, defaultFillPercentage, stackSizes...>::sm_arrayOfStacks = {}; template<int allocatorID, double defaultFillPercentage, size_t... stackSizes> std::vector<RawMemoryAllocationRecord> GenericChunkAllocator<allocatorID, defaultFillPercentage, stackSizes...>::sm_rawAllocations = {};
内容的提问来源于stack exchange,提问作者Ebony Ayers
相关产品推荐
相关产品推荐

