为何无法调用模板参数类型的模板成员函数?
如何在模板函数中调用模板成员函数并显式指定模板参数?
解决方案
在调用模板成员函数时,添加template关键字即可解决编译错误,修正后的idx_ar1函数如下:
template <typename arr_type, const std::size_t val> int idx_ar1(const arr_type& ar, const idx_t<val>& idx) { return ar.template get<val>(); // 新增template关键字 }
原因解析
这是C++语法解析规则导致的问题:
- 在第一个可编译版本中,
arr_type是具体的ar_t类型,编译器提前知道get是模板成员函数,能正确识别<是模板参数列表的起始符号。 - 在第二个版本中,
arr_type是模板参数(依赖类型),编译器在模板实例化前无法确定get的属性——它可能是一个成员变量,此时<会被误解析为小于运算符,进而触发语法错误。添加template关键字是明确告知编译器:后续的get是模板成员函数,需按照模板语法解析<>中的参数。
修正后的完整代码
#include <iostream> struct ar_t { int data[2]; ar_t(void) {data[0] = 10; data[1] = 17;} template <const std::size_t idx> int get(void) const {return data[idx];} }; template <const std::size_t val> struct idx_t {}; template <typename arr_type, const std::size_t val> int idx_ar1(const arr_type& ar, const idx_t<val>& idx) { return ar.template get<val>(); } int main(int argc, char** argv) { ar_t x; const std::size_t index = 1; idx_t<index> i; idx_ar1(x,i); return 0; }
内容的提问来源于stack exchange,提问作者wvn
相关产品推荐
相关产品推荐

