【问题标题】:Standard container for incomplete types不完整类型的标准容器
【发布时间】:2018-02-16 15:02:07
【问题描述】:

我在容器和不完整类型方面遇到了一点问题。

我有这个代码:

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);

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

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

谢谢!

【问题讨论】:

  • 使用std::vector&lt;IncompleteType&lt;my_type&gt;&gt;
  • 顺便说一句,您的班级声明 class IncompleteType&lt;T&gt; 无效。 C++ 编译器不会编译它。
  • 既然您提到了多态性,请注意如果您尝试存储派生类型,std::vector&lt;Base&gt; 其中Base 是基本类型会导致对象切片。
  • @S.M.你是对的,这是一个错字。我编辑了它:)
  • 不完整的类型类似于class Incomplete;。您在这里拥有的是一个类模板,它根本不是一种类型。您可能会将其与 Java 或 C# 中的泛型之类的东西混在一起。

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


【解决方案1】:

你没有不完整的类型——你有一个类模板。它通常会吸引刚接触 C++ 的人,但具有不同类型的该模板的实例化(对于编译器/类型系统而言)完全不相关

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

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

发生的情况是您为自己的类型和所需的流类型重载了

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

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

【讨论】:

  • 谢谢,我会尽量绕过这个问题,应该不难。谢谢
  • 选择ostringstream而不是ostream有什么特别的原因吗?
  • @Caleth - 主要是因为最初的发布者谈到了将结构流式传输到字符串。一个常规的 ostream 可能被用于二进制流/归档。
猜你喜欢
  • 2020-11-13
  • 2020-01-14
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多