模板子集合 类
Collection of template child classes
我对模板 class 还是个新手。但是我有一个父 class 然后是一个模板子 class.
namespace Foo::Bar {
class BaseClass {
// No declarations
};
template<typename ChildClassType>
class ChildClass : public BaseClass {
public:
/// Public declarations
private:
// Private Members
};
}
编辑:包括有关 ChildClassType 的更多信息
所以我有几个结构将使用这个模板 class.
struct foofoo {
// Declarations
}
struct barbar {
// Declarations
}
我希望能够拥有每个类型的多个子 classes 的向量,所以我使用了
std::vector<std::unique_ptr<BaseClass>> allChildTypeVector;
std::unique_ptr<ChildClass<foofoo>> childPtr;
allChildTypeVectors.push_back(childPtr);
这里有其他几个答案推荐的。但是我得到了。
没有重载函数实例“std::vector<_Tp, _Alloc>::push_back .....”匹配参数列表
如果我这样做也会出现同样的错误allChildTypeVectors.push_back(new ChildClass<ChildClassType>);
我知道我的类型出了点问题,但我似乎无法弄清楚。
std::unique_ptr
s无法复制。如果您可以复制它们,它们将不是唯一的。因此,当您尝试调用 push_back
时会出现错误。如果你确实有一个 std::unique_ptr<ChildClass<foofoo>>
被放置在向量中,你可以移动它:
#include <string>
#include <memory>
#include <vector>
class BaseClass {};
template<typename ChildClassType>
class ChildClass : public BaseClass {};
struct foofoo {};
int main() {
std::vector<std::unique_ptr<BaseClass>> allChildTypeVector;
std::unique_ptr<ChildClass<foofoo>> childPtr;
allChildTypeVector.push_back(std::move(childPtr));
}
请注意,这与 ChildClass
是模板无关。没有模板 classes。 ChildClass
是一个 class 模板,ChildClass<foofoo>
是一个 class.
So then why does allChildTypeVectors.push_back(new ChildClass); not work? Because that would be the ideal solution.
采用原始指针的构造函数是显式的。参见此处:https://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr。您可以显式调用构造函数或使用 std::make_unique
:
allChildTypeVector.push_back(std::unique_ptr<ChildClass<foofoo>>(new ChildClass<foofoo>));
allChildTypeVector.push_back(std::make_unique<ChildClass<foofoo>>());
A non-explicit 构造函数不太理想,因为原始指针会隐式转换为 unique_ptr
s 而不会引起注意。详情请参考Why is unique_ptr<T>(T*) explicit?.
我对模板 class 还是个新手。但是我有一个父 class 然后是一个模板子 class.
namespace Foo::Bar {
class BaseClass {
// No declarations
};
template<typename ChildClassType>
class ChildClass : public BaseClass {
public:
/// Public declarations
private:
// Private Members
};
}
编辑:包括有关 ChildClassType 的更多信息 所以我有几个结构将使用这个模板 class.
struct foofoo {
// Declarations
}
struct barbar {
// Declarations
}
我希望能够拥有每个类型的多个子 classes 的向量,所以我使用了
std::vector<std::unique_ptr<BaseClass>> allChildTypeVector;
std::unique_ptr<ChildClass<foofoo>> childPtr;
allChildTypeVectors.push_back(childPtr);
这里有其他几个答案推荐的。但是我得到了。
没有重载函数实例“std::vector<_Tp, _Alloc>::push_back .....”匹配参数列表
如果我这样做也会出现同样的错误allChildTypeVectors.push_back(new ChildClass<ChildClassType>);
我知道我的类型出了点问题,但我似乎无法弄清楚。
std::unique_ptr
s无法复制。如果您可以复制它们,它们将不是唯一的。因此,当您尝试调用 push_back
时会出现错误。如果你确实有一个 std::unique_ptr<ChildClass<foofoo>>
被放置在向量中,你可以移动它:
#include <string>
#include <memory>
#include <vector>
class BaseClass {};
template<typename ChildClassType>
class ChildClass : public BaseClass {};
struct foofoo {};
int main() {
std::vector<std::unique_ptr<BaseClass>> allChildTypeVector;
std::unique_ptr<ChildClass<foofoo>> childPtr;
allChildTypeVector.push_back(std::move(childPtr));
}
请注意,这与 ChildClass
是模板无关。没有模板 classes。 ChildClass
是一个 class 模板,ChildClass<foofoo>
是一个 class.
So then why does allChildTypeVectors.push_back(new ChildClass); not work? Because that would be the ideal solution.
采用原始指针的构造函数是显式的。参见此处:https://en.cppreference.com/w/cpp/memory/unique_ptr/unique_ptr。您可以显式调用构造函数或使用 std::make_unique
:
allChildTypeVector.push_back(std::unique_ptr<ChildClass<foofoo>>(new ChildClass<foofoo>));
allChildTypeVector.push_back(std::make_unique<ChildClass<foofoo>>());
A non-explicit 构造函数不太理想,因为原始指针会隐式转换为 unique_ptr
s 而不会引起注意。详情请参考Why is unique_ptr<T>(T*) explicit?.