2011-11-05 51 views
-2

下面的代码编译罚款与VS2010但没有用gcc 4.6.1编译:同样的老故事 - VS VS GCC 4.6.1

从GCC错误:

* C:\ Calculator_engine_impl.h | 20 |错误:不对应的呼叫 '(的std :: string {又名性病:: 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 
+3

什么行导致错误? – BlackBear

+3

我的源代码中没有提到对'QString'或'QChar'的任何引用。你确定你发布了正确的位? –

+0

@BlackBear会导致错误的行:result - = term_(beg,end); 这是从计算fnc。 – smallB

回答

2

您有一个名为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是否在这里得到它。

当然,解决方案是不要为局部变量和函数使用相同的名称。

+0

谢谢,是的,gcc很可能是正确的。因为我已经开始使用gcc,所以我对VS正在编译的错误数量感到不知所措,而gcc正在拒绝它们。好东西。 – smallB