Та же старая история - VS против GCC 4.6.1 - PullRequest
0 голосов
/ 05 ноября 2011

Приведенный ниже код прекрасно компилируется с VS2010, но не компилируется с gcc 4.6.1:

Ошибка от gcc:

* C: ... \ Calculator_engine_impl.h | 20 |ошибка: нет соответствия для вызова '(std :: string {aka std :: basic_string}) (__gnu_cxx :: __ normal_iterator> &, __gnu_cxx :: __ normal_iterator> &)' | *

#include "stdafx.h"


#include <iostream>
#include "Calculator_engine.h"

int main(int argc, char** argv)
{
    QString expression("1+2-3");
    auto beg = expression.begin();
    auto end = expression.end();
    while (beg != end)
    {
    qDebut() <<
     Calculator_engine<>::read_next_token_(beg,end);
    }
}

#ifndef CALCULATOR_ENGINE_H
#define CALCULATOR_ENGINE_H
#include <string>
#include <cctype>
using namespace std;
//#include "Incorrect_Expression.h"
template<class Int_T = long long>
class Calculator_engine
{
private:
    Calculator_engine();
    static Int_T expression(QString exp);
    template<class Forward_Iterator>
    static Int_T term_(Forward_Iterator& beg,Forward_Iterator& end);
public:

    template<class Forward_Iterator>
    static QString read_next_token_(Forward_Iterator& beg,Forward_Iterator& end);

public:

    static QString calculate(QString exp);
};

#include "Calculator_engine_impl.h"

#endif // CALCULATOR_ENGINE_H
#ifndef CALCULATOR_ENGINE_IMPL_H_INCLUDED
#define CALCULATOR_ENGINE_IMPL_H_INCLUDED
template<class Int_T>
class Calculator_engine;//[Forward decl]

template<class Int_T>
 template<class Forward_Iterator>
Int_T Calculator_engine<Int_T>::term_(Forward_Iterator& beg,Forward_Iterator& end)
{
    QChar token;
    Int_T result;
    switch(token)
    {
    case '*':
        break;
    case '/':
        break;
    }
}
template<class Int_T>
QString Calculator_engine<Int_T>::calculate(QString exp)
{
    Int_T result;
    auto beg = exp.begin();
    auto end = exp.end();
    while (beg != end)
    {
        QString term_ = read_next_token_(beg,end);
        QChar token = read_next_token_(beg,end);
    switch(token)
    {
    case '-':
        result -= term_(beg,end);
        break;
    case '+':
        result += term_(beg,end);
        break;
    }


    }

}

template<class Int_T>
Int_T Calculator_engine<Int_T>::expression(QString exp)
{

}


template<class Int_T>
template<class Forward_Iterator>
    QString Calculator_engine<Int_T>::read_next_token_(Forward_Iterator& beg,Forward_Iterator& end)
    {
        QString result;
        while(std::isdigit(*beg))
        {

        }
        return result;
    }

#endif // CALCULATOR_ENGINE_IMPL_H_INCLUDED

1 Ответ

2 голосов
/ 05 ноября 2011

У вас есть функция с именем term_ и локальная переменная:

Int_T Calculator_engine<Int_T>::term_(Forward_Iterator& beg,Forward_Iterator& end)
//   ....

QString term_ = read_next_token_(beg,end);
//  ...  
result -= term_(beg,end);

GCC использует самое внутреннее определение - в данном случае ваше локальное QString. Затем он пытается найти operator()(QChar*&, QChar*&), чтобы удовлетворить этот вызов, но не удается. Видимо визуальная студия делает что-то другое. Я не совсем уверен, что соответствует спецификации - но я подозреваю, что GCC получает это прямо здесь.

Решение, конечно, состоит в том, чтобы не использовать одно и то же имя для локальной переменной и функции.

...