调用可变参数模板构造函数时出现问题

问题描述 投票:0回答:1

下面的代码不起作用,它失败了,因为它找不到带有 签名的构造函数。

我知道在构造函数的情况下无法明确指定模板参数。

为什么模板参数推导失败?有什么办法让它发挥作用吗?我知道我可以使用模板工厂而不是构造函数作为解决方法(我可能会这样做,但我很好奇它是否仅适用于构造函数)

(需要 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;
}
c++11 templates constructor variadic-templates template-argument-deduction
1个回答
0
投票

如果

LastArgT
出现在模板参数包之后,编译器无法推断出它。您可以更改代码以将参数包放在末尾,或者简单地使用包扩展:

template<size_t S>
struct Foo
{
    template<typename ... ArgsT>
    Foo(const ArgsT& ... Args) : TypeSizes{sizeof(Args)...} { }
       
    std::array<size_t,S> TypeSizes;
};
© www.soinside.com 2019 - 2024. All rights reserved.