You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法调用模板参数类型的模板成员函数?

如何在模板函数中调用模板成员函数并显式指定模板参数?

解决方案

在调用模板成员函数时,添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:45:34