2012-02-21 1 views
2

Я получаю сообщение об ошибке о возвращении заявления (или гипсе) в конечной функции в следующей выдержке из библиотеки заголовка"неверный листинг из типа 'const myClass' для ввода 'int', как я могу сделать его действительным?

/////////////////////////////////////////////////////////// 
// class __HashMapDefaultProviderT 

/** 
* @internal 
* @class __HashMapDefaultProviderT 
* @brief This is an implementation of the IHashCodeProviderT interface for the HashMap class. 
* @since 1.0 
*/ 
template<class KeyType> 
class __HashMapDefaultProviderT 
    : public IHashCodeProviderT<KeyType>, 
    public Object 
{ 
public: 

    // Lifecycle 

    /** 
    * This is the default constructor for this class. 
    * 
    * @since  1.0 
    */ 
    __HashMapDefaultProviderT(void) {} 


    /** 
    * This is the destructor for this class. 
    * 
    * @since  1.0 
    */ 
    virtual ~__HashMapDefaultProviderT(void) {} 


    // Operation 

    /** 
    * Gets the hash code of the specified object 
    * 
    * @since  1.0 
    * @return  The hash code of the specified object 
    * @see   Osp::Base::Object::GetHashCode 
    */ 
    int GetHashCode(const KeyType& obj) const 
    { 
     return (int)obj; 
    } 


}; 

ошибка:

недействителен литая из типа «сопзЬ myClass 'to type' int '

Какое исправление для этого? Заголовочный файл называется FBaseColHashMapT.h

Я добавил operator> и operator< метод уже, но я не знаю, как еще получить мой класс хэша или как разрешить бросок, который требуется выше, короткий унаследовать, но Я хотел бы посмотреть, могу ли я избежать этого. Чтобы поддержать этих двух операторов, я написал:

inline int GetHashCode() const {return myIntMember/4 + clientRect.GetHashCode();} 

Возможно, это может быть повторное использование здесь?

Я поставляет myClass в качестве ключа к этому классу шаблона и int в качестве значения.

+0

Что вы пытаетесь сделать? –

+1

Вы используете зарезервированные имена повсюду. Эта архитектура также выглядит как Java, а не хороший дизайн на C++. –

+0

@CarlNorum: Я пытаюсь передать 'myClass', который медленно собирает членов, но должен быть легким, как ключ к параметризованному классу шаблонов. Он мог бы справиться с наследованием от «Object», который определяет этот прилив, но я хотел бы предоставить эту способность, чтобы я мог избежать наследования с объекта «Object» на меньших, более высокопроизводительных классах. – John

ответ

7

Очевидно, что класс ожидает KeyType (в вашем случае myDescriptor) будет конвертирован в int. Поэтому исправление можно было бы добавить, что преобразование в myDescriptor:

class myDescriptor 
{ 
public: 
    operator int() const { return (whatever the library expects, probably a hash key); } 
    // ... 
}; 
+0

'return GetHashCode();' –

+0

Просто обратите внимание, что 'const' действительно здесь важна! Я оставил его в своем коде и не мог понять, почему в мире GCC все еще жаловался. –

2

Либо ваш класс должен обеспечить преобразование в целое:

myClass::operator int() const { 
    return myIntMember/4 + clientRect.GetHashCode(); 
} 

... или вы должны специализироваться GetHashCode() члена Класс HashMap в функция (это можно сделать в заголовке MyClass, но в пространстве имен HashMap в):

template<class KeyType> 
inline int __HashMapDefaultProviderT::GetHashCode(const myClass& obj) const { 
    return obj.myIntMember/4 + obj.clientRect.GetHashCode(); 
} 

Я не знаком с Бада, так что я могу» t сказать, что является ожидаемым подходом. Тем не менее, оба они выглядят довольно круто.