2014-04-14 8 views
0

Мне нужно создать функцию шаблона, которая ищет элемент в переменной карты. Если элемент существует, функция должна вернуть его. В противном случае я должен вернуть NULL.return NULL из шаблона C++

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, никаких альтернатив. Я бы сделал по-другому, если мог.

+1

Если 'NULL' не совместим с типом элемента, то он не может работать. – chris

+0

В чем вопрос? –

+0

верните указатель на E: 'template <класс K, класс E> * E словарь :: research (K key) {' – mah

ответ

7

Неверная конструкция этой функции. Вполне возможно, что NULL просто несовместим с типом E. Например, предположим, что E является структурой или std::string и т. Д.

Это домашнее задание школы, и я должен вернуть NULL, никаких альтернатив.

Либо ваше домашнее задание неверно, либо вы неправильно поняли его требования. Возможно, вы должны вернуть указатель на E?

+0

То, что вы говорите о несовместимости типа, является правильным, и именно по этой причине я спросил здесь. Назначение ничего не указывает на указатели, но я попробую. –

0

Вместо того чтобы возвращать указатели, вы можете подумать о возврате чего-то вроде 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; 
};