模板参数的C ++自动模板推导失败

时间:2018-09-24 14:40:10

标签: c++ c++17

我想更好地理解为什么自动模板推论(使用Step编译时适用)在interface IProps { steps: Array<IStep> } class Stepper extends React.Component<IProps, {}> { // actually, default props are moved to Step // so this one probably not needed. static defaultProps: IProps = { steps: [] } render() { return this.props.steps.map(step => <Step {...step}/>); } } class Step extends React.Component<IStep> { static defaultProps: IPartialStep = { // here you can define default props for step item completed: false, disabled: false, active: false, } render() { const {id, route, ...} = this.props; // here you define how to display every step return <div>{id}</div> } } 的前三行中起作用,而在第四行中却失败。在不久的将来有可能被编译器接受吗?

g++ -std=c++17

2 个答案:

答案 0 :(得分:3)

这只是签名问题。基本上,您传递的是错误的类型。

A aA<> a都意味着您想要一个具有默认模板参数值的A实例,也就是说,您最终得到A< void >

函数g< C >()接受一个模板参数,该参数恰好是一种类型,而不是另一种模板化类型。当使用A<>调用它时,您告诉编译器您要使用模板类型A的“实例化”,此类型是有效的。当您使用A调用它时,您告诉编译器您想使用g< C >()是不适合其签名的模板化类型来调用C

如果您像这样{/ {1}}声明/定义g(),它将接受像template <typename <typename> TTemplatedType> g()这样的调用,但是g< A >()将失败,因为现在它不再需要别的东西了模板类型。

答案 1 :(得分:3)

对于C ++ 17,当将类模板的名称用作要构造的对象的类型时,也会执行模板参数推导。

模板中的显式类型没有任何变化。