不完整类型的标准容器

时间:2018-02-16 15:02:07

标签: c++ templates polymorphism c++-standard-library

我遇到容器和类型不完整的问题。

我有这段代码:

template<typename T>
class IncompleteType
{ /*Class Definition*/ }

在另一个类中,我想使用不完整类型的向量。 此类将c样式的结构序列化为字符串,因此无论我提供什么类型,行为都是相同的。

然而,当我这样做时:

std::vector<IncompleteType>

或者这个:

std::vector<IncompleteType*>

编译器抱怨我没有为模板类提供参数列表。

我想做的是这样的事情:

IncompleteType<Type1> a;
IncompleteType<Type2> b;

std::vector<IncompleteType*> vector;

vector.push_back(&a);
vector.push_back(&b);

有没有办法让容器成为不完整的类型?

这是实现多态的错误方法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

你没有不完整的类型 - 那里有一个类模板。它通常会引出C ++新手,但是不同类型的模板的实例化(对于编译器/类型系统)完全不相关

模板本身也不是实例化的“基类” - 如果不提​​供模板类型参数,则不能使用它。

当你在谈论“序列化为字符串”时,我想知道你是否正在寻找流媒体运营商 - 特别是流式传输到字符串流(参见例如https://docs.microsoft.com/en-us/cpp/standard-library/overloading-the-output-operator-for-your-own-classes)。

重载&lt;&lt;&lt;&lt;&lt;&lt;&lt;您自己的类型的运算符和所需的流类型,例如

std::ostringstream& operator<<(std::ostringstream& i_stream, const MyType& i_val) {
  i_stream << "( " << i_val.GetValue1() << ", " << i_val.GetValue2() << " )" << std::endl;
  return i_stream;
}

然后,您可以将任何类型的对象流式传输到字符串流中,只要您为它重载了流操作符。

相关问题