代码之家  ›  专栏  ›  技术社区  ›  HolyBlackCat

在类自身的成员函数中构造类时,如何强制类模板参数推导?

  •  11
  • HolyBlackCat  · 技术社区  · 6 年前

    请考虑以下代码:

    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::foo ?

    我希望我没有遗漏一些显而易见的东西。

    2 回复  |  直到 6 年前
        1
  •  21
  •   T.C. Yksisarvinen    6 年前

    您限定它,使它不是注入的类名。

    auto foo() {return ::B(A{});}
    
        2
  •  4
  •   R Sahu    6 年前

    另一种选择是使用函数为您进行类型推断。

    template <typename T> B<T> make_b(T t) { return B<T>(t); }
    

    使用

    auto foo() {return make_b(A{});}