考虑以下代码:
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();
}
我理解为什么B :: foo()不编译:在结构B< T>内部,B(作为注入类名)意味着B< T>.除非它明确用作模板.在这种情况下,这会阻止类模板参数推断.
假设我不能做自动foo(){返回B< A>(A {});}因为我的实际代码依赖于稍微精细的用户提供的演绎指南.
问题是:在B :: foo中构造B时,如何强制类模板参数推导?
我希望我不会错过一些明显的东西.
解决方法:
你有资格使它不是注入类名.
auto foo() {return ::B(A{});}