Ошибка компиляции Linux - GCC 4.3.4 - слишком мало списков параметров шаблона - PullRequest
1 голос
/ 20 февраля 2012

У меня очень маленький заголовок, который содержит следующий код. Код компилируется в Windows 7 уже 6 месяцев, но не работает в Linux с gcc 4.3.4. Я пробовал несколько способов заставить его работать, но, к сожалению, ничего не происходит. Кто-нибудь из вас имеет представление о том, что может быть не так?

Привет

#ifndef UTILS_H
#define UTILS_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <algorithm>

template <class T>
unsigned int findUpperElement(const std::vector<T>& aVec, const T& aTargetValue)
{
    typedef std::vector<T>::const_iterator itType;
    itType itMatch=upper_bound (aVec.begin(),aVec.end(), aTargetValue);
    return std::distance<itType>(aVec.begin(),itMatch);

}

template <class T>
unsigned int findLowerElement(const std::vector<T>& aVec, const T& aTargetValue)
{
    typedef std::vector<T>::const_iterator itType;
    itType itMatch=lower_bound (aVec.begin(),aVec.end(), aTargetValue);
    return std::distance< itType> (aVec.begin(),itMatch);

}

#endif

Вот ошибки, которые я получаю:

./utilslib/Utils.h: In function ‘unsigned int findUpperElement(const std::vector<T, std::allocator<_Tp1> >&, const T&)’:
./utilslib/Utils.h:15: error: too few template-parameter-lists
./utilslib/Utils.h:16: error: ‘itType’ was not declared in this scope
./utilslib/Utils.h:16: error: expected `;' before ‘itMatch’
./utilslib/Utils.h:17: error: ‘itType’ cannot appear in a constant-expression
./utilslib/Utils.h:17: error: ‘itMatch’ was not declared in this scope
./utilslib/Utils.h: In function ‘unsigned int findLowerElement(const std::vector<T, std::allocator<_Tp1> >&, const T&)’:
./utilslib/Utils.h:24: error: too few template-parameter-lists
./utilslib/Utils.h:25: error: ‘itType’ was not declared in this scope
./utilslib/Utils.h:25: error: expected `;' before ‘itMatch’
./utilslib/Utils.h:26: error: ‘itType’ cannot appear in a constant-expression
./utilslib/Utils.h:26: error: ‘itMatch’ was not declared in this scope

Ответы [ 2 ]

7 голосов
/ 20 февраля 2012

Добавьте ключевое слово typename к этим строкам:

typedef std::vector<T>::const_iterator itType;

изменится на:

typedef typename std::vector<T>::const_iterator itType;

Ваш const_iterator является вложенным-зависимым-type - тип, вложенный в ваш тип параметра-типа, который зависит от него. Чтобы понять это различие, вы должны указать ключевое слово typename - сообщить компилятору, что это имя типа, основанного на вашем шаблоне.тип T.

Компиляторы часто не реализуют это достаточно корректно - некоторые позволяют вам обходиться без больше, чем другие.

Чтобы привести пример причины, по которой это необходимо, рассмотрим следующее:

T::X * var_name;

Компилятор может интерпретировать это как «Я хочу указатель на тип T :: X с именем var_name» или он может подумать «Я хочу умножить статическую переменную X в классе T на значение, хранящееся в var_name".

Добавление typename следующим образом:

typename T::X * var_name;

заставит его предпочесть первое, потому что теперь он знает, что T :: X является типом в этом контексте.

0 голосов
/ 21 февраля 2012

Самая большая проблема, которую я вижу в вашем коде, заключается в том, что вы используете std::vector без включения файла заголовка для вектора.

Добавьте #include <vector> к нему, посмотрите, поможет ли это.

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