gpt4 book ai didi

c++ - 为什么 C++ 不能推断模板化的非类型模板参数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:34 25 4
gpt4 key购买 nike

代码如下:

template <typename T, int P> struct _t_test_struct{
T t;
int p=P;
};
typedef _t_test_struct<float, 6> _test_struct6;

template <typename T, typename TP, TP P, template<typename, TP> class C>
void test1(C<T,P> &x){
std::vector<T> _a;
_a.resize(P);
_a[0] = x.t;
std::cout<<"typeid(P):"<<typeid(P).name()<<std::endl;

};

_test_struct6 _testp;
_testp.t = 10;
test1(_testp);

为什么编译器无法确定 TPint ?我只能称它为 test1<float, int>(_testp) .

最佳答案

Why the compiler cannot determine the TP is int? I can only call it like test1<float, int>(_testp).

如果编译 C++11 或 C++14,则不能。

如果你编译 C++17 就可以,因为 C++17 改进了模板推导规则。

建议:看看corresponding page in CPP Reference .

如果我理解正确,问题是直到 C++17“无法从非类型模板参数的类型推导模板类型参数”。

在你的情况下,

template <typename T, typename TP, TP P, template<typename, TP> class C>
void test1(C<T,P> &x)

TP无法从 P 中推导出类型, 一个 TP值(但如果你显式 TP ,调用 test1<float, int>(_testp) 则有效)

从C++17开始,“当用依赖类型声明的非类型模板形参P对应的实参值从表达式中推导出来时,P类型中的模板形参从值的类型。”,所以 TPP 推导出来.

关于c++ - 为什么 C++ 不能推断模板化的非类型模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270234/

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