首页 > 解决方案 > 在自己的成员函数中构造类时如何强制类模板参数推导?

问题描述

考虑以下代码:

struct A {};

template <typename T> struct B
{
    B(T) {}
    auto foo() {return B(A{});} // error: no matching function for call to 'B<int>::B(A)'
};

auto foo() {return B(A{});} // compiles

int main()
{
    foo();
    B b(0);
    b.foo();
}

Try it live

我理解为什么B::foo()不编译:在struct B<T>,内部B(作为注入的类名)意味着B<T>除非它被明确用作模板。在这种情况下,它可以防止类模板参数推导。

假设我做不到,auto foo() {return B<A>(A{});}因为我的实际代码依赖于稍微复杂的用户提供的演绎指南。

B问题是:在内部构造时如何强制类模板参数推导B::foo

我希望我没有遗漏一些明显的东西。

标签: c++c++17

解决方案


您对其进行限定,使其不是注入的类名。

auto foo() {return ::B(A{});}

推荐阅读