2013-06-06 3 views
0

Это на Mac OSX 10.8. Использование библиотеки Стэнфордского CPP (доступные в http://www.stanford.edu/class/cs106b/materials/cppdoc/), и, используя следующий код:Стэнфордская библиотека C++ Ошибка библиотеки

#include <iostream> 
#include "simpio.h" 
#include "map.h" 
#include "vector.h" 
using namespace std; 

int main() { 
    Map<Vector<char> , Vector<char> > frequencies; 
    return 0; 
} 

Я получаю сообщение об ошибке, на Xcode 4:

/Applications/Xcode.app/Contents/Developer/ Платформы/MacOSX.platform/Developer/SDK/MacOSX10.8.sdk/usr/include/C++/4.2.1/bits/stl_function.h: 227: 20: Недопустимые операнды для двоичного выражения ('const Vector' и 'const Векторный ')

Почему это?

+0

Умм, независимо от того, что сказал вам преподаватель, эта библиотека не используется вне вашей аудитории. – Potatoswatter

+3

Использовать вектор как тип ключа выглядит подозрительно. – cxyzs7

+0

Пожалуйста, разместите весь текст выхода компилятора. Что-то пошло не так в экземпляре шаблона «Карта», и ошибки должны вернуться к «main». – Potatoswatter

ответ

1

Быстрый взгляд на Vector documentation показывает, что он не поддерживает сравнения, которые являются концептуальной необходимостью для любого типа ключа.

Вам нужно будет указать функтор сравнения до Map или определить operator <(Vector<T> const &, Vector<T> const &) так, чтобы библиотека находила его зависящим от аргумента поиска.

Но у вашей библиотеки, похоже, нет поддержки для функторов сравнения, а char не может использоваться в качестве крючка для зависящего от аргумента поиска, поэтому, похоже, библиотека Stanford не поддерживает это. Класс обертки (несколько продвинутый метод) был бы обходным путем, но это было бы бессмысленным усилием.

Очень жаль, если ваш учебный план не распространяется на стандартную библиотеку ISO. Было бы лучше ожидать от Стэнфорда.


EDIT К сожалению, вы можете просто определить operator< в глобальном пространстве имен, так как Map не в пространстве имен. Это должно сделать трюк.

template< typename T > 
bool operator < (Vector<T> const &lhs, Vector<T> const &rhs) { 
    return std::lexicographical_compare(
     & lhs.get(0), & lhs.get(lhs.size()), 
     & rhs.get(0), & rhs.get(rhs.size())); 
} 
+0

Я не пытаюсь сравнить Векторы, хотя, я пытаюсь создать карту с вектором в качестве ключевого типа, а Вектор - как тип значения. – pyrrhic

+1

@ user2457967 Как «Карта» использует «Вектор» как ключевой тип без каких-либо операций сравнения? Если карта реализована как отсортированная структура, для нее потребуется операция меньше, чем если бы она была хешированной структурой, она должна была бы равняться. – Potatoswatter

+1

@ user2457967 Ключ для Карты должен поддерживать возможность выполнять сравнения, иначе Карта не может функционировать. – Patashu

Смежные вопросы