【问题标题】:Return NULL from a C++ template从 C++ 模板返回 NULL
【发布时间】:2014-05-28 14:19:03
【问题描述】:

我必须创建一个模板函数来搜索地图变量中的元素。如果元素存在,函数必须返回它。否则它必须返回 NULL。

template <class K, class E> E dictionary<K,E>::research(K key) {

// map<K,E> elements;

if(elements.find(key) != elements.end()) {
    return elements.find(key)->second;
} else {
    return NULL;
}

由于返回类型是 E,返回 NULL 总是给我一个错误。我怎样才能使这项工作?或者我必须以不同的方式构建我的功能?

这是学校的家庭作业,我必须返回 NULL,别无选择。如果可以的话,我个人会做不同的事情。

【问题讨论】:

  • 如果NULL 与元素的类型不兼容,那么它就不可能工作。
  • 问题是什么?
  • 返回指向 E 的指针:template &lt;class K, class E&gt; *E dictionary&lt;K,E&gt;::research(K key){
  • @mah,我猜这个任务需要一个指针。
  • @BrianCain 我编辑了我的问题,抱歉我不是很清楚。

标签: c++ class templates null


【解决方案1】:

您可以考虑返回类似 boost::optional 的东西,而不是返回指针,即设置为包含有效对象或处于无效状态的类型。这以某种方式模仿指针,但更明确

以下只是说明原理,实现肯定可以优化。

template<typename T> class Optional {
public:
   Optional(E e): 
      isValid(true),
      mValue(e)
   {}

   Optional(): isValid(false), mValue() {}

   bool isDefined() const {return isValid;}

   E getOrElse(E const& other) const {return (isValid) ? (mValue) : (other);}

   E get(E const {return mValue;} 
private:
    bool isValid;
    T mValue;
};

【讨论】:

    【解决方案2】:

    这个函数的设计不正确。 NULL 完全有可能与 E 类型不兼容。例如,假设E 是一个结构,或者std::string 等等。

    这是学校的家庭作业,我必须返回NULL,别无选择。

    要么你的家庭作业不正确,要么你误解了它的要求。您可能会返回指向E 的指针?

    【讨论】:

    • 你所说的类型不兼容是正确的,这就是我在这里问的原因。该作业没有指定有关指针的任何内容,但我会尝试一下。
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 2017-02-18
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2018-02-06
    • 2018-02-21
    相关资源
    最近更新 更多