具有默认模板参数的多态类的模板推导失败
Template deduction fails for polymorphic class with default template parameters
考虑这个例子:
#include <memory>
template<typename T>
class A {};
template<typename T1, typename T2>
class B: public A<T1> {};
template<typename T = int>
void foo(std::shared_ptr< A<T> > test)
{
}
int main()
{
auto p = std::make_shared<B<int, int>>();
foo<int>(p); // Works
foo<>(p); // Does not work
foo(p); // Does not work
}
我试图在不显式指定foo的类型T的情况下编译它,但它不起作用。我不知道为什么如果我明确地指定了T类型,它就可以正常工作,但如果我指定了,它就不会编译,即使我已经告诉编译器如果我没有明确指定T类型,T应该是什么。
我明白为什么编译器不能推导类型t,但为什么在我没有指定的情况下它不能使用我的默认类型t?我该如何解决这个问题?什么是"正确"的方法?
问题与默认模板参数无关。相反,p
(std::shared_ptr<B<int, int>>
(的类型无法与模板foo
的std::shared_ptr<T>
参数匹配:在模板参数推导过程中,不考虑转换,将对派生类实例的引用作为基类引用传递确实是一种转换。
您可以通过显式向上转换std::shared_ptr
管理的指针来解决此问题。
std::shared_ptr<A<int>> p = std::make_shared<B<int, int>>();
现在,这些电话将按预期进行:
foo<>(p); // Ok, argument matches the signature
foo(p); // Same...
请注意,模板参数类型是否出现在函数模板的参数列表中(使推导成为可能(有很大的区别。考虑这两个模板,
template <class T = int> void foo(T&&)
{
std::cout << __PRETTY_FUNCTION__ << "n";
}
template <class T = int> void bar(double)
{
std::cout << __PRETTY_FUNCTION__ << "n";
}
两者都有默认类型int
,但当它们像一样实例化时
foo<>(0.0); // outputs: void foo(T&&) [with T = double]
bar<>(0.0); // outputs: void bar(double) [with T = int]
第一个实例化使用函数参数来推导模板参数(结果为double
(,而第二个实例化不推导任何内容,默认为int
。
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- variadic模板中的模板参数推导失败
- 当给定默认值时,为什么此模板参数推导失败
- 模板参数推导失败,函数参数/参数不匹配
- 为什么模板参数推导失败?
- 嵌套参数包扩展失败
- 模板参数的 C++ 自动模板推导失败
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
- 在 g++ 6.2.1 中将参数包转发到 constructor() 失败
- 当变量和参数名称匹配时,移动语义构造失败
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 模板参数推导/替换失败,lambda作为函数指针
- 调用基函数时模板参数推导失败
- 类模板参数推导失败会导致替换失败
- 折叠表达式模板参数推导/替换失败
- 结果失败或多个参数无效