使用 ARM GCC 编译列表迭代器时出现模板编译时错误

发布于 2024-11-19 10:16:00 字数 3181 浏览 3 评论 0原文

这段代码在GCC ARM下编译时让我很头疼。我在 MSVC++ 编译器 2010 中很好地使用它。我收到如下编译错误:

Error 1 error : Expected ';' before 'i' C:\Users\Ryan\Desktop\droplets\source\MultiList.h 62

为什么我的模板化代码不能使用 GCC 进行编译?

#ifndef MULTILIST_H
#define MULTILIST_H

#include <list>
#include <fstream>

using namespace std;

/*
 A list of lists
 */
template <typename E> 
class MultiList {

protected:
    list<list<E>*>      m_lists;
    list<E>             *m_pCurrList;

public:

    MultiList();
    ~MultiList();
    /*
    Starts a new list internally, given the first element
    */
    void BeginNewList(E firstElement);

    /*
    Adds an element to the current list
    */
    void AddElement(E newElement);

    /*
    Removes a given element from it's place in one of the lists,
    splitting that list into two lists internally.
    */
    void RemoveElement(E element);

    /*
    Returns a list of all element lists
    */
    list<list<E>*> *GetLists() {
        return &m_lists;
    };

    /*
    Return the list that's currently being populated with AddElement()
    */
    list<E>* GetCurrentList() {
        return m_pCurrList;
    };

};

template<typename E>
MultiList<E>::MultiList() {
    m_pCurrList = NULL;
}

template<typename E>
MultiList<E>::~MultiList() {
    for(list<list<E>*>::iterator i = m_lists.begin(); i != m_lists.end(); i++) {
        list<E>::iterator j;
        for(j = (*i)->begin(); j != (*i)->end(); j++) {
            SDELETE(*j)
        }
        SDELETE(*i)
    }
}

/*
Starts a new list internally, given the first element
*/
template<typename E>
void MultiList<E>::BeginNewList(E firstElement) {
    list<E> *newlist = new(list<E>);
    newlist->push_back(firstElement);
    m_lists.push_back(newlist);
    m_pCurrList = newlist;
}

/*
Adds an element to the current list
*/
template<typename E>
void MultiList<E>::AddElement(E newElement) {
    m_pCurrList->push_back(newElement);
}

/*
Removes a given element from it's place in one of the lists,
splitting that list into two lists internally.
*/
template<typename E>
void MultiList<E>::RemoveElement(E element) {
    list<E>* found = NULL;
    list<E>::iterator foundIT = NULL;

    // find which list 'element' is in
    for(list<list<E>*>::iterator i = m_lists.begin(); i != m_lists.end(); i++) {
        list<E>::iterator j;
        for(j = (*i)->begin(); j != (*i)->end(); j++) {
            E listElement = (*j);
            if(listElement == element) {
                found = (*i);
                foundIT = j;
                break;
            }
        }
        if (j != (*i)->end()) break; // we breaked out of the inner loop
    }
    // now erase it and split the list
    if (found) {
        list<E>::iterator next = found->erase(foundIT);
        list<E> *newlist = new(list<E>);
        m_lists.push_back(newlist);
        newlist->splice(newlist->begin(), *found, next, found->end());
        SDELETE(element)
    }
}

#endif

This code gives me many headaches when compiling under GCC ARM. I am using it fine with MSVC++ compiler 2010. I get compile errors like:

Error 1 error : expected ';' before 'i' C:\Users\Ryan\Desktop\droplets\source\MultiList.h 62

Why won't my templated code compile using GCC?

#ifndef MULTILIST_H
#define MULTILIST_H

#include <list>
#include <fstream>

using namespace std;

/*
 A list of lists
 */
template <typename E> 
class MultiList {

protected:
    list<list<E>*>      m_lists;
    list<E>             *m_pCurrList;

public:

    MultiList();
    ~MultiList();
    /*
    Starts a new list internally, given the first element
    */
    void BeginNewList(E firstElement);

    /*
    Adds an element to the current list
    */
    void AddElement(E newElement);

    /*
    Removes a given element from it's place in one of the lists,
    splitting that list into two lists internally.
    */
    void RemoveElement(E element);

    /*
    Returns a list of all element lists
    */
    list<list<E>*> *GetLists() {
        return &m_lists;
    };

    /*
    Return the list that's currently being populated with AddElement()
    */
    list<E>* GetCurrentList() {
        return m_pCurrList;
    };

};

template<typename E>
MultiList<E>::MultiList() {
    m_pCurrList = NULL;
}

template<typename E>
MultiList<E>::~MultiList() {
    for(list<list<E>*>::iterator i = m_lists.begin(); i != m_lists.end(); i++) {
        list<E>::iterator j;
        for(j = (*i)->begin(); j != (*i)->end(); j++) {
            SDELETE(*j)
        }
        SDELETE(*i)
    }
}

/*
Starts a new list internally, given the first element
*/
template<typename E>
void MultiList<E>::BeginNewList(E firstElement) {
    list<E> *newlist = new(list<E>);
    newlist->push_back(firstElement);
    m_lists.push_back(newlist);
    m_pCurrList = newlist;
}

/*
Adds an element to the current list
*/
template<typename E>
void MultiList<E>::AddElement(E newElement) {
    m_pCurrList->push_back(newElement);
}

/*
Removes a given element from it's place in one of the lists,
splitting that list into two lists internally.
*/
template<typename E>
void MultiList<E>::RemoveElement(E element) {
    list<E>* found = NULL;
    list<E>::iterator foundIT = NULL;

    // find which list 'element' is in
    for(list<list<E>*>::iterator i = m_lists.begin(); i != m_lists.end(); i++) {
        list<E>::iterator j;
        for(j = (*i)->begin(); j != (*i)->end(); j++) {
            E listElement = (*j);
            if(listElement == element) {
                found = (*i);
                foundIT = j;
                break;
            }
        }
        if (j != (*i)->end()) break; // we breaked out of the inner loop
    }
    // now erase it and split the list
    if (found) {
        list<E>::iterator next = found->erase(foundIT);
        list<E> *newlist = new(list<E>);
        m_lists.push_back(newlist);
        newlist->splice(newlist->begin(), *found, next, found->end());
        SDELETE(element)
    }
}

#endif

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

寂寞花火° 2024-11-26 10:16:00

它不会编译,因为它充满了错误:

g++ -Wall /tmp/junk.c
/tmp/junk.c: In destructor ‘MultiList<E>::~MultiList()’:
/tmp/junk.c:62:9: error: need ‘typename’ before ‘std::list<std::list<E>*>::iterator’ because ‘std::list<std::list<E>*>’ is a dependent scope
/tmp/junk.c:62:34: error: expected ‘;’ before ‘i’
/tmp/junk.c:62:55: error: ‘i’ was not declared in this scope
/tmp/junk.c:63:9: error: need ‘typename’ before ‘std::list<E>::iterator’ because ‘std::list<E>’ is a dependent scope
/tmp/junk.c:63:27: error: expected ‘;’ before ‘j’
/tmp/junk.c:64:13: error: ‘j’ was not declared in this scope
/tmp/junk.c:65:23: error: there are no arguments to ‘SDELETE’ that depend on a template parameter, so a declaration of ‘SDELETE’ must be available
/tmp/junk.c:65:23: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
/tmp/junk.c:66:9: error: expected ‘;’ before ‘}’ token
/tmp/junk.c:67:19: error: there are no arguments to ‘SDELETE’ that depend on a template parameter, so a declaration of ‘SDELETE’ must be available
/tmp/junk.c:68:5: error: expected ‘;’ before ‘}’ token
/tmp/junk.c: In member function ‘void MultiList<E>::RemoveElement(E)’:
/tmp/junk.c:97:5: error: need ‘typename’ before ‘std::list<E>::iterator’ because ‘std::list<E>’ is a dependent scope
/tmp/junk.c:97:23: error: expected ‘;’ before ‘foundIT’
/tmp/junk.c:100:9: error: need ‘typename’ before ‘std::list<std::list<E>*>::iterator’ because ‘std::list<std::list<E>*>’ is a dependent scope
/tmp/junk.c:100:34: error: expected ‘;’ before ‘i’
/tmp/junk.c:100:55: error: ‘i’ was not declared in this scope
/tmp/junk.c:101:9: error: need ‘typename’ before ‘std::list<E>::iterator’ because ‘std::list<E>’ is a dependent scope
/tmp/junk.c:101:27: error: expected ‘;’ before ‘j’
/tmp/junk.c:102:13: error: ‘j’ was not declared in this scope
/tmp/junk.c:106:17: error: ‘foundIT’ was not declared in this scope
/tmp/junk.c:114:9: error: need ‘typename’ before ‘std::list<E>::iterator’ because ‘std::list<E>’ is a dependent scope
/tmp/junk.c:114:27: error: expected ‘;’ before ‘next’
/tmp/junk.c:117:51: error: ‘next’ was not declared in this scope
/tmp/junk.c:119:5: error: expected ‘;’ before ‘}’ token

使用 -Wall 并了解它的抱怨是什么。更好的问题可能是为什么 MSVC 抱怨?

It won't compile because it is chock full o'errors:

g++ -Wall /tmp/junk.c
/tmp/junk.c: In destructor ‘MultiList<E>::~MultiList()’:
/tmp/junk.c:62:9: error: need ‘typename’ before ‘std::list<std::list<E>*>::iterator’ because ‘std::list<std::list<E>*>’ is a dependent scope
/tmp/junk.c:62:34: error: expected ‘;’ before ‘i’
/tmp/junk.c:62:55: error: ‘i’ was not declared in this scope
/tmp/junk.c:63:9: error: need ‘typename’ before ‘std::list<E>::iterator’ because ‘std::list<E>’ is a dependent scope
/tmp/junk.c:63:27: error: expected ‘;’ before ‘j’
/tmp/junk.c:64:13: error: ‘j’ was not declared in this scope
/tmp/junk.c:65:23: error: there are no arguments to ‘SDELETE’ that depend on a template parameter, so a declaration of ‘SDELETE’ must be available
/tmp/junk.c:65:23: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
/tmp/junk.c:66:9: error: expected ‘;’ before ‘}’ token
/tmp/junk.c:67:19: error: there are no arguments to ‘SDELETE’ that depend on a template parameter, so a declaration of ‘SDELETE’ must be available
/tmp/junk.c:68:5: error: expected ‘;’ before ‘}’ token
/tmp/junk.c: In member function ‘void MultiList<E>::RemoveElement(E)’:
/tmp/junk.c:97:5: error: need ‘typename’ before ‘std::list<E>::iterator’ because ‘std::list<E>’ is a dependent scope
/tmp/junk.c:97:23: error: expected ‘;’ before ‘foundIT’
/tmp/junk.c:100:9: error: need ‘typename’ before ‘std::list<std::list<E>*>::iterator’ because ‘std::list<std::list<E>*>’ is a dependent scope
/tmp/junk.c:100:34: error: expected ‘;’ before ‘i’
/tmp/junk.c:100:55: error: ‘i’ was not declared in this scope
/tmp/junk.c:101:9: error: need ‘typename’ before ‘std::list<E>::iterator’ because ‘std::list<E>’ is a dependent scope
/tmp/junk.c:101:27: error: expected ‘;’ before ‘j’
/tmp/junk.c:102:13: error: ‘j’ was not declared in this scope
/tmp/junk.c:106:17: error: ‘foundIT’ was not declared in this scope
/tmp/junk.c:114:9: error: need ‘typename’ before ‘std::list<E>::iterator’ because ‘std::list<E>’ is a dependent scope
/tmp/junk.c:114:27: error: expected ‘;’ before ‘next’
/tmp/junk.c:117:51: error: ‘next’ was not declared in this scope
/tmp/junk.c:119:5: error: expected ‘;’ before ‘}’ token

Use -Wall and understand what its complaints are. A better question might be why did MSVC not complain?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文