Ошибка компилятора в G ++, но не в VS2008, шаблоны stl - PullRequest
2 голосов
/ 02 июня 2011

Я компилирую один и тот же проект под двумя разными компиляторами.Приведенный ниже фрагмент прекрасно компилируется под VS2008, но выдает следующую ошибку при попытке скомпилировать его под G ++ с Eclipse

G ++ Сообщение об ошибке:

common.h: In function 'int ci_find_substr(const T&, const T&, const std::locale&)':
common.h:84: error: expected `;' before 'it'
common.h:86: error: 'it' was not declared in this scope

Фрагмент исходного кода

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

#include <string>
#include <algorithm>
#include <locale>
#include <iostream>
#include <algorithm>  

using namespace std ; 

// templated version of my_equal so it could work with both char and wchar_t
template<typename charT>
struct my_equal {
    my_equal( const std::locale& loc ) : loc_(loc) {}
    bool operator()(charT ch1, charT ch2) {
        return std::toupper(ch1, loc_) == std::toupper(ch2, loc_);
    }
private:
    const std::locale& loc_;
};

// find substring (case insensitive)
template<typename T>
int ci_find_substr( const T& str1, const T& str2, const std::locale& loc = std::locale() )
{
    T::const_iterator it = std::search( str1.begin(), str1.end(),
        str2.begin(), str2.end(), my_equal<T::value_type>(loc) );
    if ( it != str1.end() ) return it - str1.begin();
    else return -1; // not found
}

Любая помощь, предложения или советы помогут.Благодарю.

1 Ответ

2 голосов
/ 02 июня 2011

Попробуйте ввести typename T::const_iterator it = std::search(etc.) Я не думаю, что он распознает T::const_iterator как тип.

Когда я попытался скомпилировать ваш код в g ++ 4.5.2, он дал мне следующее сообщение об ошибке, котороеподтверждает это

error: need 'typename' before 'T:: const_iterator' because 'T' is a dependent scope

Редактировать: Вам также нужно это на my_equal<T::value_type>(loc).Должен быть изменен на my_equal<typename T::value_type>(loc)

...