我有一个具有多个专业化的项目,但我需要在每个专业化中使用一些“BasicStuff”。问题:我需要使用一些模板,因为只有特化才能知道某些对象的外观。
例如,我有一些类“BasicData”,“BasicDataHolder”和“BasicDataManager”,其中BasicData将是一个带时间戳的类。 BasicDataHolder会将BasicData保存为向量,但具有更多功能。 BasicDataManager将使用BasicDataHolder的多个对象。
现在出现问题:
在每个专业化中,我都有一些从BasicData派生的“SpecialData”。而且我必须在某个时候使用BasicDataManager1,在另一个专门化中使用BasicDataManager2,它们都是从BasicDataManager派生的。
不幸的模板对我来说就像伏都教,但我尝试了以下内容:
// BasicData.hpp
class BasicData {
int foo;
};
// BasicDataHolder.hpp
template< typename T>
class BasicDataHolder {
static_assert(std::is_base_of<BasicData, T>::value, "!");
vector<T> data;
// other stuff
};
// BasicDataManager.hpp
template <class T>
// I tried something like template <template T> but it tells me
// error: expected '<' before 'T'
class BasicDataManager {
// This Line is a problem
static_assert(std::is_base_of<BasicDataHolder, T>::value, "!");
vector<T> holderVector;
// stuff
};
// specialDataManager
template <class T>
class SpecialDataManager : public BasicDataManager<T> {
T dostuff();
// other stuff
};
//specialDataHolder
template <class T>
class SpecialDataHolder : public BasicDataHolder<T> {
// do some stuff
};
// Specialization:
//specialData.hpp
template <typename T>
class SpecialData : public T {
static_assert(std::is_base_of<BasicData, T>::value, "!");
double bar;
//other stuff
};
现在我必须在项目专业化中初始化SpecialDataManager。 我尝试过像
// main.cpp
#include "specialData.hpp
#include "specialDataManager.hpp
#include "specialDataHolder.hpp
// This line is my problem, I think
SpecialDataManager<SpecialDataHolder<SpecialData> > myManager;
我得到多行错误,例如: “错误:'SpecialDataManager'没有命名类型”
我真正的问题是更多的维度,但我想如果我能解决这个问题,那就不再是问题了。 有人可以帮忙吗?我不确定我在哪里犯了错误......
答案 0 :(得分:0)
看起来你想要这样的东西:
class BasicData {
int foo;
// other stuff
};
template <typename T>
class BasicDataHolder {
static_assert(std::is_base_of<BasicData, T>::value, "!");
using data = vector<T>;
data mData;
// other stuff
};
template <class T>
class BasicDataManager {
using holderVector = vector<T>;
holderVector mData;
// stuff
};
template <class T>
class SpecialDataManager : public BasicDataManager<T> {
T dostuff();
// other stuff
};
template <typename T>
class SpecialDataHolder : public BasicDataHolder<T> {
// do some stuff
};
template <template T>
class SpecialData : public T {
static_assert(std::is_base_of<BasicData, T>::value, "!");
double bar;
//other stuff
};