模板子集合 类

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_ptrs无法复制。如果您可以复制它们,它们将不是唯一的。因此,当您尝试调用 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_ptrs 而不会引起注意。详情请参考Why is unique_ptr<T>(T*) explicit?.