从类模板创建对象的工厂函数模板?

时间:2018-06-14 22:57:29

标签: c++ templates

我有两个工厂函数模板makeObjectAmakeObjectB,它们从类模板(ClassTemplateAClassTemplateB)创建实例。 makeObject函数调用另一个函数模板(create),它实际实例化对象并执行一些通用初始化。因此,create函数模板需要两个模板参数,一个指定要创建的对象类型,另一个作为对象的模板参数传递。

以下是我尝试做的一个示例,但我不明白为什么这段代码会编译,以及如何修复它?

factory.h(17): error C2988: unrecognizable template declaration/definition

ClassTemplates.h

#pragma once

template <typename T>
class ClassTemplateA {

public:
    ClassTemplateA() {}

};

template <typename T>
class ClassTemplateB {

public:
    ClassTemplateB() {}

};

Factory.h

#pragma once
#include "ClassTemplates.h"

template <typename T>
ClassTemplateA<T>& makeObjectA()
{
    return create<ClassTemplateA, T>();
}

template <typename T>
ClassTemplateB<T>& makeObjectB()
{
    return create<ClassTemplateB, T>();
}

template<typename TClassTemplate, typename T>
TClassTemplate<T>& create()
{
    TClassTemplate<T>* object = new TClassTemplate<T>();

    // Do some generic initialization after construction.

    return *object;
};

Main.cpp的

#include "ClassTemplates.h"
#include "Factory.h"

int main() 
{
    ClassTemplateA<int>& objectA = makeObjectA<int>();
    ClassTemplateB<int>& objectB = makeObjectB<int>();
}

1 个答案:

答案 0 :(得分:3)

您需要模板模板参数:

template <template <typename> class TClassTemplate, typename T>
TClassTemplate<T>& create()
{
    TClassTemplate<T>* object = new TClassTemplate<T>();

    // Do some generic initialization after construction.

    return *object;
};