下面的代码不起作用,它失败了,因为它找不到带有
我知道在构造函数的情况下无法明确指定模板参数。
为什么模板参数推导失败?有什么办法让它发挥作用吗?我知道我可以使用模板工厂而不是构造函数作为解决方法(我可能会这样做,但我很好奇它是否仅适用于构造函数)
(需要 c++11 来委托构造函数)
template<size_t S>
struct Foo
{
Foo() {}
template<typename ... FirstArgsT, typename LastArgT>
Foo(const FirstArgsT& ... FirstArgs, const LastArgT& LastArg) : Foo(FirstArgs...)
{
static_assert(sizeof...(FirstArgsT)+1<=S);
TypeSizes[sizeof...(FirstArgsT)] = sizeof(LastArgT);
}
size_t TypeSizes[S];
};
int main()
{
int arg1 = 3;
bool arg2 = false;
Foo<2> foo(arg1, arg2); //error: no matching function for call to ‘Foo<2>::Foo(int&, bool&)’
return 0;
}
如果
LastArgT
出现在模板参数包之后,编译器无法推断出它。您可以更改代码以将参数包放在末尾,或者简单地使用包扩展:
template<size_t S>
struct Foo
{
template<typename ... ArgsT>
Foo(const ArgsT& ... Args) : TypeSizes{sizeof(Args)...} { }
std::array<size_t,S> TypeSizes;
};