C++模板问题:转换为null

sor*_*h-r 2 c++ templates

我有一个Stack容器类,我想创建各种类型的堆栈的实例.所以我这样做:

template <typename T>
class MyStack
{
.
.
   T Pop()
   {
      if(!IsEmpty())
      {
         return data[top--];
      }
      else
      {
         return NULL; // I got error here
      }
 .
 .
}
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样使用Stack时:

MyStack<GraphNode> blacks;
GraphNode t = blacks.Pop();
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

conversion from ‘int’ to non-scalar type ‘GraphNode’ requested
Run Code Online (Sandbox Code Playgroud)

但是,当我使用指针类型时Stack<GraphNode*>,没有问题.我知道那NULL0,我理解为什么会出现错误...告诉程序没有更改代码就没有数据返回的优雅方法是什么?我应该向类添加类似隐式类型转换运算符的东西吗?怎么样?

注意:我没有使用STL

CB *_*ley 6

通过返回Tby值,函数的契约是您返回一个值.两种选择是更改函数的合约(例如,返回一个T*)或者通过抛出异常而无法返回.

就个人而言,我认为在这种情况下抛出异常是可以接受和适当的.返回指针,或者说引用覆盖并返回布尔成功值都是不太干净的解决方案.

特别是如果您提供公共IsEmpty()方法,则没有理由选择不太干净的解决方案.不想处理异常的客户端可以利用它IsEmpty来避免接收异常,该异常变成了断言的等价物.

  • @SorushRabiee:这是一种方法,但如果有人弹出一个值并推送一个新的,如果他们保留弹出的指针,他们会期望保留一个指向旧值的指针呢? (2认同)

Oli*_*rth 5

STL std::stack将此功能拆分为top(),返回对最后一个元素的引用,和pop().如果您使用其中任何一个并且堆栈已经为空(即if empty() == true),则该行为是未定义的.这听起来不是一个糟糕的方法.