2013-06-20 4 views
3

QVariants 키를 사용하여 데이터 구조를 만들려고합니다. 그것은 다음과 같습니다qvariant를 키로 사용

QHash<QPair<QVariant, QVariant>, SHAPES::Shape* > _shapes; 

은 불행히도 없다 "로 호출 일치 기능 'qHash (CONST이 &를 QVariant)'".

그래서 나는 QVariants에 대한 qHash 내 자신의 구현 정의 :

#pragma once 

#include <QVariant> 
#include <QHash> 

uint qHash(const QVariant & var) 
{ 
    if (!var.isValid() || var.isNull()) 
     //return -1; 
     Q_ASSERT(0); 

    switch (var.type()) 
    { 
     case QVariant::Int: 
       return qHash(var.toInt()); 
      break; 
     case QVariant::UInt: 
       return qHash(var.toUInt()); 
      break; 
     case QVariant::Bool: 
       return qHash(var.toUInt()); 
      break; 
     case QVariant::Double: 
       return qHash(var.toUInt()); 
      break; 
     case QVariant::LongLong: 
       return qHash(var.toLongLong()); 
      break; 
     case QVariant::ULongLong: 
       return qHash(var.toULongLong()); 
      break; 
     case QVariant::String: 
       return qHash(var.toString()); 
      break; 
     case QVariant::Char: 
       return qHash(var.toChar()); 
      break; 
     case QVariant::StringList: 
       return qHash(var.toString()); 
      break; 
     case QVariant::ByteArray: 
       return qHash(var.toByteArray()); 
      break; 
     case QVariant::Date: 
     case QVariant::Time: 
     case QVariant::DateTime: 
     case QVariant::Url: 
     case QVariant::Locale: 
     case QVariant::RegExp: 
       return qHash(var.toString()); 
      break; 
     case QVariant::Map: 
     case QVariant::List: 
     case QVariant::BitArray: 
     case QVariant::Size: 
     case QVariant::SizeF: 
     case QVariant::Rect: 
     case QVariant::LineF: 
     case QVariant::Line: 
     case QVariant::RectF: 
     case QVariant::Point: 
     case QVariant::PointF: 
      // not supported yet 
      break; 
     case QVariant::UserType: 
     case QVariant::Invalid: 
     default: 
      return -1; 
    } 

    // could not generate a hash for the given variant 
    return -1; 
} 

을하지만 컴파일러는 방법은 여러 번 정의되는 것을 말한다.

QHash에서 QVariant를 키로 사용하는 방법은 무엇입니까? 또는 : 내가 뭘 잘못하고 있니?

+1

'QHash' include 앞에 함수 정의를 넣으십시오. –

+1

컴파일하는 데 문제가 없습니다. QHash , QVariant> _shapes; – asclepix

+0

@asclepix 실행중인 Qt 버전은 무엇입니까? 4.8이나 5.0에서'qHash (QVariant) '를 볼 수 없습니다. – cmannett85

답변

5

qHash 구현이 헤더 파일에있는 것으로 보입니다. 구현하지 않고 헤더 파일에 선언해야합니다.

uint qHash(const QVariant & var); 

구현은 해당 소스 파일에 배치해야합니다.

qHash()#include <QHash> 앞에 표시해야합니다.

+0

요구 사항은 입니다. uint qHash (const QVariant & var) ; 은 전에 포함되어야합니다. #include 은 QHash를 포함하지 않아도 QHash가 포함 된 헤더를 포함하면 코드가 컴파일되지 않기 때문에 실제로 더러워집니다. 클래스를 먼저 포함시키고 qHash 함수를 선언함으로써이 문제를 해결할 수있었습니다. – dmiller309

+0

와우, 헤더를 포함하기 전에 qHash 정의에 대한 요구 사항을 이해할 수 없습니다. 그리고 나는 그것이 꽤 심한 것에 동의합니다. –

+0

리눅스에서 Qt 4.7.4와 함께 include하기 전에'qHash()'를 배치하는 것이 필요하지 않은 것 같습니다 (GCC 4.4 이상). – Murphy