从另一个函数模板调用函数模板时出现语法错误求助
解决成员函数模板调用的语法错误
嘿,这个问题我熟!你遇到的是C++模板编程里的常见坑——编译器没法确定Object->GetComponent<T>里的<到底是模板参数列表的开始,还是小于号运算符,所以才抛出了unexpected token ')', expected 'expression'的错误。
问题根源
你的第二个GetComponent模板函数中,调用Object->GetComponent<T>()时,Object的类型是std::shared_ptr<GameObject>,而GameObject的GetComponent是一个成员函数模板。在模板上下文里,Object->GetComponent属于依赖名称(它的具体类型依赖于GameObject的定义),编译器在第一次解析模板(未实例化阶段)时,无法判断GetComponent是成员变量还是成员函数模板,会默认把<当成比较运算符来解析,最终导致语法错误。
解决方案
只需要在调用成员函数模板时,加上template关键字,明确告诉编译器这是一个模板函数的实例化调用:
std::shared_ptr<GameObject> Object; template <typename T> std::shared_ptr<T> GetComponent() { // 加上template关键字,明确指定GetComponent是模板函数 return Object->template GetComponent<T>(); }
补充说明
如果是通过类名直接调用静态成员模板函数,语法类似:
template <typename T> std::shared_ptr<T> GetComponent() { return GameObject::template GetComponent<T>(); }
template关键字的作用就是在依赖名称场景下,给编译器明确的提示,避免它把模板参数的<>和比较运算符混淆。
内容的提问来源于stack exchange,提问作者Wahoozel
相关产品推荐
相关产品推荐

