ошибка: ожидаемый инициализатор до токена ‘<’ _Mod <_Tp, __m, __a, __c, false, true> :: при использовании gcc 4.8.5 для компиляции кода - PullRequest
0 голосов
/ 07 марта 2019

Я получил много ошибок ниже, когда я использовал gcc 4.8.5 для компиляции кода C ++ в CentOS 7, где мой файл, rwg_client_agent.cpp, использовал некоторые функции в strutil.h, которые имели шаблоны для обработки строки.

У меня два вопроса:

  1. Я использовал gcc / g ++ версии 4.8.5, но от /usr/include/c++/4.8.5 ln до /usr/include/c++/4.8.2, почему?
  2. Что не так в strutil.h и strutil.cpp?
#ifndef STRUTIL_INCLUDE
#define STRUTIL_INCLUDE
#include <string>
#include <vector>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <iconv.h>

// declaration
namespace strutil {
    std::string trimLeft(const std::string& str);
    std::string trimRight(const std::string& str);
    std::string trim(const std::string& str);
    std::string trimRightChar(const std::string& str, char c);
    std::string trimLeftChar(const std::string& str, char c);
    std::string toLower(const std::string& str);
    std::string toUpper(const std::string& str);
    bool startsWith(const std::string& str, const std::string& substr);
    bool endsWith(const std::string& str, const std::string& substr);
    bool equalsIgnoreCase(const std::string& str1, const std::string& str2);
    bool contains(const std::string& str, const std::string& substr);
    template<class T> T parseString(const std::string& str);
    template<class T> T parseHexString(const std::string& str);
    //template<bool> bool parseString(const std::string& str);
    template<class T> std::string toString(const T& value);
    template<class T> std::string toHexString(const T& value, int width = 0);
    std::string toString(const bool& value);
    std::vector<std::string> split(const std::string& str, const std::string& delimiters);
    std::string getPureDigits(const std::string& str);
    std::string getNonDigits(const std::string& str);
    std::string getInteger(const std::string& str);
    std::string getAlphaNumeric(const std::string& str);
    std::string getSubStr(const std::string& str, const std::string& strPrefix,  const std::string& strPostfix);
    std::string getSubStr(const std::string& str, const std::string& strPrefix);
    std::vector<std::string>  getWordsOfNumber(unsigned int number);
    int ascii_to_utf8(const std::string& ascii, std::string& utf8);
    int code_convert(char *from_charset, char *to_charset, char *inbuf, size_t inlen, char *outbuf, size_t outlen);
}

// Tokenizer class
namespace strutil {
    class Tokenizer {
        public:
        static const std::string DEFAULT_DELIMITERS;
        Tokenizer(const std::string& str);
        Tokenizer(const std::string& str, const std::string& delimiters);
        bool nextToken();
        bool nextToken(const std::string& delimiters);
        const std::string getToken() const;
        /**
        * to reset the tokenizer. After reset it, the tokenizer can get
        * the tokens from the first token.
        */
        void reset();
        protected:
        size_t m_Offset;
        const std::string m_String;
        std::string m_Token;
        std::string m_Delimiters;
    };

}

// implementation of template functions
namespace strutil {
    template<class T> T parseString(const std::string& str) {
        T value;
        std::istringstream iss(str);
        iss >> value;
        return value;
    }

    /*
    template<class T> T parseHexString(const std::string& str) {
        T value;
        std::istringstream iss(str);
        iss >> hex >> value;
        return value;
    }

    */
    template<class T> std::string toString(const T& value) {
        std::ostringstream oss;
        oss << value;
        return oss.str();
    }

    /*
    template<class T> std::string toHexString(const T& value, int width) {
        std::ostringstream oss;
        oss << hex;
        if (width > 0) {
            oss << setw(width) << setfill('0');
        }
        oss << value;
        return oss.str();
    }

    */
}

#endif
#include "strutil.h"
#include <algorithm>
#include <string.h>
namespace strutil {
    using namespace std;
    string trimLeft(const string& str) {
        string t = str;
        t.erase(0, t.find_first_not_of(" /t/n/r"));
        return t;
    }

    string trimRight(const string& str) {
        string t = str;
        t.erase(t.find_last_not_of(" /t/n/r") + 1);
        return t;
    }

    std::string trimLeftChar(const std::string& str, char c)
    {
        string t = str;
        t.erase(0, t.find_first_not_of(c));
        return t;
    }

    std::string trimRightChar(const std::string& str, char c)
    {
        string t = str;
        t.erase(t.find_last_not_of(c) + 1);
        return t;
    }

    string trim(const string& str) {
        string t = str;
        t.erase(0, t.find_first_not_of(" /t/n/r"));
        t.erase(t.find_last_not_of(" /t/n/r") + 1);
        return t;
    }

    string toLower(const string& str) {
        string t = str;
        transform(t.begin(), t.end(), t.begin(), ::tolower);
        return t;
    }

    string toUpper(const string& str) {
        string t = str;
        transform(t.begin(), t.end(), t.begin(), ::toupper);
        return t;
    }

    bool startsWith(const string& str, const string& substr) {
        return str.find(substr) == 0;
    }

    bool endsWith(const string& str, const string& substr) {
        return str.rfind(substr) == (str.length() - substr.length());
    }

    bool equalsIgnoreCase(const string& str1, const string& str2) {
        return toLower(str1) == toLower(str2);
    }

    /*template<bool>
    bool parseString(const std::string& str) {
        bool value;
        std::istringstream iss(str);
        iss >> boolalpha >> value;
        return value;
    }
    */

    string toString(const bool& value) {
        ostringstream oss;
        oss << boolalpha << value;
        return oss.str();
    }

    vector<string> split(const string& str, const string& delimiters) {
        vector<string> ss;
        Tokenizer tokenizer(str, delimiters);
        while (tokenizer.nextToken()) {
            ss.push_back(tokenizer.getToken());
        }
        return ss;
    }

    std::string getPureDigits(const std::string& str)
    {
        std::string strPureNumber;
        for(int i=0; i<str.length(); i++)
        {
            char c = str[i];
            if(c >='0' && c <='9') strPureNumber += c;
        }
        return strPureNumber;
    }

    std::string getAlphaNumeric(const std::string& str)
    {
        std::string strPureNumber;
        for(int i=0; i<str.length(); i++)
        {
            char c = str[i];
            if((c >='0' && c <='9') || (c >='a' && c <='z') || (c >='A' && c <='Z') ) strPureNumber += c;
        }
        return strPureNumber;
    }

    std::string getInteger(const std::string& str)
    {
        std::string strPureNumber;
        for(int i=0; i<str.length(); i++) {
            char c = str[i];
            if(c >='0' && c <='9') {
                if(strPureNumber.empty() && c == '0') {
                }
                else {
                    strPureNumber += c;
                }
            }
        }
        return strPureNumber;
    }

    std::string getNonDigits(const std::string& str) {
        std::string strRet;
        for(int i=0; i<str.length(); i++) {
            char c = str[i];
            if(c < '0' || c >'9') strRet += c;
        }
        return strRet;
    }

    std::string getSubStr(const std::string& str, const std::string& strPrefix,  const std::string& strPostfix) {
        size_t nPosBegin = str.find(strPrefix);
        size_t nPosEnd = str.find(strPostfix);
        if(nPosBegin != std::string::npos && nPosEnd != std::string::npos && nPosEnd > (nPosBegin+strlen(strPrefix.c_str())) ) {
            std::string strRet = str.substr(nPosBegin+strlen(strPrefix.c_str()), nPosEnd-nPosBegin-strlen(strPrefix.c_str()));
            return strRet;
        }
        return "";
    }

    std::string getSubStr(const std::string& str, const std::string& strPrefix) {
        size_t nPosBegin = str.find(strPrefix);
        if(nPosBegin != std::string::npos) {
            return str.substr(nPosBegin+strlen(strPrefix.c_str()));
        }
        return "";
    }

    std::vector<std::string>  getWordsOfNumber(unsigned int number) {
        if(number<0 || number>4294967295) //no need to support too large value. since it is useless. {
            std::vector<std::string> empty;
            return empty ;
        }
        std::string onesName[] = {
            "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"
        };
        std::string teensName[] = {
            "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
        };
        std::string tensName[] = {
            "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
        };
        std::string illion_preName[] = {
            "million", "billion"
        };
        std::string numStr=strutil::toString(number);
        std::ostringstream oss;;
        while( numStr.size()%3 != 0 )
            numStr = '0' + numStr;

        // pad the string with leading '0' until size = multiple of 3
        for( unsigned int i = 0; i < numStr.size(); i += 3 ) {
            // skip if all 3 digits == '0'
            if( numStr[i] == '0' && numStr[i+1] == '0' && numStr[i+2] == '0' )
                continue;
            if( numStr[i + 0] > '0' )// treat the hundreds place
                oss << onesName[ numStr[i + 0] - '0' - 1 ] << " hundred ";
            if( numStr[i + 1] == '0' || numStr[i + 1] > '1' )// treat tens and ones digits for non-teens case {
                if( numStr[i + 1] > '1' ) oss << tensName[ numStr[i + 1] - '0' - 2 ] << " ";
                if( numStr[i + 2] > '0' ) oss << onesName[ numStr[i + 2] - '0' - 1 ] << " ";
            }
            else// special teens case
                oss << teensName[ numStr[i + 2] - '0' ] << " ";
            // naming each factor of 1,000
            unsigned int j = ( numStr.size() - i )/3;
            if( j == 2 ) oss << "thousand ";
            else if( j > 2 )
            {
                if( j <= 4 ) oss << illion_preName[ j - 3 ] << " ";
            }
        }
        std::string strWords=oss.str();
        std::string delimiters=" ";
        return strutil::split( strWords, delimiters);
    }

    int ascii_to_utf8(const std::string& ascii, std::string& utf8) {
        //char outbuf[1024] = {
        0
    };
    size_t outlength = ascii.length() * 4 + 1;
    char *outbuf = new char[outlength];
    //int  ret = code_convert("gb2312", "utf-8",gb.c_str(), gb.length(), outbuf, sizeof(outbuf));
    int  ret = code_convert("ascii//translit", "utf-8",const_cast<char *>(ascii.c_str()), ascii.length(), outbuf, outlength);
    if( ret == 0 ) {
        utf8 = outbuf;
    }
    delete [] outbuf;
    return ret;
}

int code_convert(char *from_charset, char *to_charset, char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
    iconv_t cd;
    int     rc;
    char **pin = &inbuf;
    char **pout = &outbuf;
    cd = iconv_open(to_charset, from_charset);
    if( cd == 0 ) {
        return -1;
    }
    memset(outbuf,0,outlen);
    if( iconv(cd, pin, &inlen, pout, &outlen) == -1 ) {
        iconv_close(cd);
        return -1;
    }
    iconv_close(cd);
    return 0;
}

}
namespace strutil {
    const string Tokenizer::DEFAULT_DELIMITERS("  ");
    Tokenizer::Tokenizer(const std::string& str)
        : m_String(str), m_Offset(0), m_Delimiters(DEFAULT_DELIMITERS) {
        }

    Tokenizer::Tokenizer(const std::string& str, const std::string& delimiters)
        : m_String(str), m_Offset(0), m_Delimiters(delimiters) {
        }

    bool Tokenizer::nextToken() {
        return nextToken(m_Delimiters);
    }

    bool Tokenizer::nextToken(const std::string& delimiters) {
        // find the start charater of the next token.
        size_t i = m_String.find_first_not_of(delimiters, m_Offset);
        if (i == string::npos) {
            m_Offset = m_String.length();
            return false;
        }

        // find the end of the token.
        size_t j = m_String.find_first_of(delimiters, i);
        if (j == string::npos) {
            m_Token = m_String.substr(i);
            m_Offset = m_String.length();
            return true;
        }

        // to intercept the token and save current position
        m_Token = m_String.substr(i, j - i);
        m_Offset = j;
        return true;
    }

    const string Tokenizer::getToken() const {
        return m_Token;
    }

    void Tokenizer::reset() {
        m_Offset = 0;
    }
}
                 from /usr/include/c++/4.8.2/bits/stl_algo.h:65,
                 from /usr/include/c++/4.8.2/algorithm:62,
                 from strutil.h:10,
                 from rwg_client_agent.cpp:8:
/usr/include/c++/4.8.2/bits/random.tcc:52:11: error: expected initializer before ‘<’ token
       _Mod<_Tp, __m, __a, __c, false, true>::
           ^
/usr/include/c++/4.8.2/bits/random.tcc:99:31: error: expected initializer before ‘<’ token
     linear_congruential_engine<_UIntType, __a, __c, __m>::multiplier;
                               ^
/usr/include/c++/4.8.2/bits/random.tcc:103:31: error: expected initializer before ‘<’ token
     linear_congruential_engine<_UIntType, __a, __c, __m>::increment;
                               ^
/usr/include/c++/4.8.2/bits/random.tcc:107:31: error: expected initializer before ‘<’ token
     linear_congruential_engine<_UIntType, __a, __c, __m>::modulus;
                               ^
/usr/include/c++/4.8.2/bits/random.tcc:111:31: error: expected initializer before ‘<’ token
     linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed;
                               ^
/usr/include/c++/4.8.2/bits/random.tcc:119:31: error: expected initializer before ‘<’ token
     linear_congruential_engine<_UIntType, __a, __c, __m>::
                               ^
/usr/include/c++/4.8.2/bits/random.tcc:135:7: error: too many template-parameter-lists
       linear_congruential_engine<_UIntType, __a, __c, __m>::
       ^
/usr/include/c++/4.8.2/bits/random.tcc:157:15: error: ‘linear_congruential_engine’ does not name a type
         const linear_congruential_engine<_UIntType,
               ^
/usr/include/c++/4.8.2/bits/random.tcc:157:41: error: expected ‘,’ or ‘...’ before ‘<’ token
         const linear_congruential_engine<_UIntType,
                                         ^
/usr/include/c++/4.8.2/bits/random.tcc: In function ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, int)’:
/usr/include/c++/4.8.2/bits/random.tcc:168:15: error: ‘__lcr’ was not declared in this scope
       __os << __lcr._M_x;
               ^
/usr/include/c++/4.8.2/bits/random.tcc: At global scope:
/usr/include/c++/4.8.2/bits/random.tcc:179:9: error: ‘linear_congruential_engine’ has not been declared
         linear_congruential_engine<_UIntType, __a, __c, __m>& __lcr)
         ^
/usr/include/c++/4.8.2/bits/random.tcc:179:35: error: expected ‘,’ or ‘...’ before ‘<’ token
         linear_congruential_engine<_UIntType, __a, __c, __m>& __lcr)
                                   ^
/usr/include/c++/4.8.2/bits/random.tcc: In function ‘std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, int)’:
/usr/include/c++/4.8.2/bits/random.tcc:187:15: error: ‘__lcr’ was not declared in this scope
       __is >> __lcr._M_x;
               ^
/usr/include/c++/4.8.2/bits/random.tcc: At global scope:
/usr/include/c++/4.8.2/bits/random.tcc:200:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:209:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:218:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:227:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:236:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:245:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:254:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:263:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:272:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:281:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:290:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:299:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:308:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:318:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:327:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:353:7: error: too many template-parameter-lists
       mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
       ^
/usr/include/c++/4.8.2/bits/random.tcc:397:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:433:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:451:5: error: expected nested-name-specifier before ‘mersenne_twister_engine’
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
     ^
/usr/include/c++/4.8.2/bits/random.tcc:451:28: error: expected initializer before ‘<’ token
     mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d,
                            ^
/usr/include/c++/4.8.2/bits/random.tcc:478:15: error: ‘mersenne_twister_engine’ does not name a type
         const mersenne_twister_engine<_UIntType, __w, __n, __m,
               ^
/usr/include/c++/4.8.2/bits/random.tcc:478:38: error: expected ‘,’ or ‘...’ before ‘<’ token
         const mersenne_twister_engine<_UIntType, __w, __n, __m,
                                      ^
/usr/include/c++/4.8.2/bits/random.tcc: In function ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, int)’:
/usr/include/c++/4.8.2/bits/random.tcc:491:10: error: ‘__x’ was not declared in this scope
  __os << __x._M_x[__i] << __space;
          ^
/usr/include/c++/4.8.2/bits/random.tcc:492:15: error: ‘__x’ was not declared in this scope
       __os << __x._M_p;
               ^
/usr/include/c++/4.8.2/bits/random.tcc: At global scope:
/usr/include/c++/4.8.2/bits/random.tcc:506:9: error: ‘mersenne_twister_engine’ has not been declared
         mersenne_twister_engine<_UIntType, __w, __n, __m,
         ^
/usr/include/c++/4.8.2/bits/random.tcc:506:32: error: expected ‘,’ or ‘...’ before ‘<’ token
         mersenne_twister_engine<_UIntType, __w, __n, __m,
                                ^
/usr/include/c++/4.8.2/bits/random.tcc: In function ‘std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, int)’:
/usr/include/c++/4.8.2/bits/random.tcc:516:10: error: ‘__x’ was not declared in this scope
  __is >> __x._M_x[__i];
          ^
/usr/include/c++/4.8.2/bits/random.tcc:517:15: error: ‘__x’ was not declared in this scope
       __is >> __x._M_p;
               ^
/usr/include/c++/4.8.2/bits/random.tcc: At global scope:
/usr/include/c++/4.8.2/bits/random.tcc:526:31: error: expected initializer before ‘<’ token
     subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size;
                               ^
/usr/include/c++/4.8.2/bits/random.tcc:530:31: error: exp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...