gpt4 book ai didi

c++ - 使用 typename 参数时,模板参数推导/替换失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:41 24 4
gpt4 key购买 nike

我有以下代码,它定义了一个模板结构 W,它导出一个类型 T,该类型基于 W 的模板参数:

#include <iostream>
using namespace std;

template <unsigned N>
struct Y {};

template <unsigned N>
struct W {
using T = Y<N>;
};

然后我定义了这个查看此类型 T 的模板函数:

template <unsigned N>
void foo (const typename W<N>::T& in) {
//--
}

这里的问题是,如果我尝试使用导出为 T 的类型之一从 main 调用此函数,它不会编译。例如,如果我写

int main() {
Y<2> y;
foo(y);
return 0;
}

我得到一个编译器错误

template argument deduction/substitution failed:

couldn't deduce template parameter

这是怎么回事?

最佳答案

C++ 编译器无法解决这个问题的原因与模板特化有关。例如,假设您特化了 W像这样构造模板:

template <> struct W<137> {
using T = Y<0>; // Not Y<137>
};

现在,假设您调用 foo , 传入 Y<0>作为论据。编译器应该推导出什么作为 N 的数值?它可能为零,因为 W<0>定义 T作为Y<0> .但它也可以很容易地成为 137,因为 W<137>定义 T作为Y<0>

更一般地说,C++ 永远不会尝试根据内部 类型之一将模板参数的类型推导到外部 模板,原因正是上述原因.

关于c++ - 使用 typename 参数时,模板参数推导/替换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47117339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com