【发布时间】:2019-08-13 06:01:21
【问题描述】:
考虑以下几点:
#include <memory>
#include <utility>
#include <vector>
class Base
{
public:
Base()
: x(0)
{}
int x;
virtual ~Base() = default;
};
class Derived : public Base
{
public:
Derived(double z0)
: Base{}
, z{ z0 }
{}
double z;
};
template<class T> // T might be either a Base or a Derived class.
std::vector<std::shared_ptr<Base>> MakeVector(std::size_t numElements)
{
std::vector<std::shared_ptr<Base>> vec;
for(auto &i : numElements) { // Compiler error occurs here.
vec.push_back(std::make_shared<T>());
}
return vec;
}
class Foo
{
public:
Foo(std::size_t num_elements,
std::vector<std::shared_ptr<Base>> bars = {})
: m_bars{bars.empty() ? MakeVector<Base>(num_elements) : std::move(bars)}
{}
std::vector<std::shared_ptr<Base>> m_bars;
};
int main()
{
const std::size_t foo1Size = 4;
const std::size_t foo2Size = 5;
// Create a vector of shared_ptr to 4 Base objects:
Foo foo1 {foo1Size};
// Create a vector of shared_ptr to 5 Derived objects:
Foo foo2 {foo2Size, MakeVector<Derived>(foo2Size)};
}
这里的目标是创建请求数量的Base 或Derived 对象,并用shared_ptrs 向这些对象填充std::vector。
for 语句出现编译器错误:
错误:“开始”没有依赖于模板的参数 参数,因此“开始”的声明必须可用 [-fpermissive]
如果我将std::iterator 与begin 和end 一起使用,不幸的是,迭代器对每个push_back 都无效。无论如何,我需要迭代特定次数来填充向量。
这个问题有明显的解决办法吗?
【问题讨论】:
标签: c++ templates inheritance shared-ptr stdvector