为什么c ++无法推断模板化的非类型模板参数?

时间:2018-01-15 20:29:43

标签: c++ c++11 templates template-deduction

以下是代码:

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)

1 个答案:

答案 0 :(得分:4)

  

为什么编译器无法确定TPint?我只能将其称为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推断出来。