给出以下代码
#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);
}
Run Code Online (Sandbox Code Playgroud)
为什么我会收到错误
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);
^
Run Code Online (Sandbox Code Playgroud)
编译器是否应该能够Base从类型中推导出模板参数v?
我可以通过改变第27行来纠正这个问题
vector<MyBase> v = makeBaseVec<MyBase>(a, 10);
Run Code Online (Sandbox Code Playgroud)
但这感觉不必要.
编译器是否应该能够从类型中推导出模板参数Base
v?
该类型的v,当你调用不是由模板类型推演机制考虑makeBaseVec.如果您要调用该函数并丢弃返回值,该怎么办?
返回类型不参与类型推导或重载解析.
如果您不想重复自己,可以v改为使用类型扣除:
auto v = makeBaseVec<MyBase>(a, 10);
Run Code Online (Sandbox Code Playgroud)
事实上,几乎总是auto一个很好的变量政策.
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |