我想更好地理解为什么自动模板推论(使用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
答案 0 :(得分:3)
这只是签名问题。基本上,您传递的是错误的类型。
A a
和A<> 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,当将类模板的名称用作要构造的对象的类型时,也会执行模板参数推导。
模板中的显式类型没有任何变化。