我遇到容器和类型不完整的问题。
我有这段代码:
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);
有没有办法让容器成为不完整的类型?
这是实现多态的错误方法吗?
谢谢!
答案 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;
}
然后,您可以将任何类型的对象流式传输到字符串流中,只要您为它重载了流操作符。