给出以下代码
#include <vector>
#include <memory>
using namespace std;
class MyBase
{};
class MyDerived : public MyBase
{};
template<class Base, class Derived>
vector<Base> makeBaseVec(const Derived& obj, const typename vector<Base>::size_type size)
{
vector<Base> out;
for (typename vector<Base>::size_type i = 0; i < size; i++)
{
out.push_back(Base(obj) /* copy constructor */);
}
return out;
}
int main()
{
MyDerived a;
vector<MyBase> v = makeBaseVec<MyBase>(a, 10);
}
为什么我会收到错误
main.cpp:13:14: note: template argument deduction/substitution failed:
main.cpp:29:41: note: couldn't deduce template parameter 'Base'
vector<MyBase> v = makeBaseVec(a, 10);
^
编译器是否应该能够从Base
的类型中推导出模板参数v
?
我可以通过将第27行改为
来纠正这个问题vector<MyBase> v = makeBaseVec<MyBase>(a, 10);
但这感觉不必要。
答案 0 :(得分:7)
编译器是否应该能够从
v
的类型中推断出模板参数Base?
当您致电v
时,模板类型扣减机制不会考虑makeBaseVec
的类型。如果您要调用该函数并丢弃返回值该怎么办?
返回类型不参与类型扣除或重载解析。
如果您不想重复自己,可以在v
上使用类型扣除:
auto v = makeBaseVec<MyBase>(a, 10);
事实上,几乎总是auto
是一个很好的变量政策。