Аргументы шаблона для шаблонных функций - PullRequest
9 голосов
/ 19 декабря 2010

Я только что выпустил библиотеку контейнеров скиплиста. И компилятор Sun жалуется на это:

template <class T, class R>
bool operator==(const IndexedSkipList<T,R> &left, const IndexedSkipList<T,R> &right)
{
  return ((left.size() == right.size()) &&
          (std::equal(left.begin(), left.end(), right.begin())));
}

Ошибки:

"include/CSIndexedSkipList.h", line 65: Error: Too few arguments for template std::reverse_iterator<CS::BidiIdxIterator<CS::IndexedSkipList<CS::T, CS::R>>>.
"include/CSIndexedSkipList.h", line 207:     Where: While specializing "CS::IndexedSkipList<CS::T, CS::R>".
"include/CSIndexedSkipList.h", line 207:     Where: Specialized in non-template code.

Приведенный выше код начинается с 207. Но похоже, что он жалуется на reverse_iterator. Я не могу понять это. У меня нет прямого доступа к компилятору Sun, поэтому мне было интересно, что я делаю что-то не так.

Кроме того, я использую только один аргумент шаблона в reverse_iterator, но я заметил, что в документации SGI говорится, что для второго аргумента T нет значения по умолчанию. Везде, где я смотрел, они просто используют это:

typedef std::reverse_iterator<iterator> reverse_iterator;

Это строка 65, на которую жалуется компилятор. Нужно ли добавлять T в качестве параметра? Я не могу понять ошибку, о которой идет речь.

Кстати, это работает на gcc на всех платформах, которые я смог найти. И это работает и в Borland.

Ответы [ 2 ]

10 голосов
/ 19 декабря 2010

Как объяснено на Сравнивая стандартные библиотеки C ++ libCstd и libstlport , компилятор Sun C ++ поставляется с двумя реализациями "стандартной библиотеки C ++": libCstd и libstlport.К сожалению, libCstd не соответствует стандартам, но это значение по умолчанию из соображений обратной совместимости.Среди прочих отличий версия шаблона std::reverse_iterator в libCstd использует более одного параметра шаблона.

Вам необходимо указать компилятору использовать libstlport, передав опцию компилятора -library=stlport4.

См. Также:

0 голосов
/ 27 ноября 2011

Кстати, -library=stlport4 НЕ является опцией для критичных к производительности многопоточных приложений, работающих на Solaris, потому что версия STLPort, поставляемая с Sun Studio 12.1 / 12.2, намного медленнее, чем libCstd из-за мьютексов спин-блокировки при распределении/ освобождение, которое слишком медленно в Solaris.STLPort5 должно быть лучше в этом отношении, но мне не удалось построить его на Solaris.Кажется, что STLPort больше не поддерживается и не используется в Solaris, если не сказать больше.Итак, нам пришлось полностью перейти на libCstd для всего нашего программного обеспечения, как на SPARC, так и на x86.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...