首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码可以在g++ 4.4.1上本地编译,但不能在codepad.org (g++ 4.1.2)上本地编译吗?(引用引用问题)?)

代码可以在g++ 4.4.1上本地编译,但不能在codepad.org (g++ 4.1.2)上本地编译吗?(引用引用问题)?)
EN

Stack Overflow用户
提问于 2009-12-29 17:59:38
回答 2查看 204关注 0票数 1

我正在写一个测试用例来解决我的应用程序中的一个更大的问题。我结束了在codepad上尝试一些代码,发现一些在我的本地机器(带有-Wall的g++ 4.4.1 )上编译的代码不能在codepad (g++ 4.1.2)上编译,即使我的本地机器有更新版本的g++。

Codepad称这是对引用错误的引用,我查找了一下,找到了一些关于它的信息。看起来有一个引用的stl容器并不是一个好主意。这是否意味着我需要定义自己的PairPages类?如果是这样的话,为什么要在本地编译呢?到底怎么回事?

代码板链接:http://codepad.org/UAaJI1rl

代码语言:javascript
复制
#include <deque>
#include <utility>
#include <iostream>

using namespace std;

class Page {
  public:
    Page() : number_(++count) {}
    int getNum() const { return number_; }
  private:
    static int count;
    int number_;
};

int Page::count = 0;

class Book {
  public:
    Book() : currPageIdx_(3) {
      int numPages = 5;
      while (numPages > 0) {
        pages_.push_back(Page());
        numPages--; // oops
      }
    }
    pair<const Page&, const Page&> currPages() { return pagesAt(currPageIdx_); }
    pair<const Page&, const Page&> pagesAt(int pageNo) { return make_pair(pages_[pageNo - 1], pages_[pageNo]); }
    //const Page& currPages() { return pagesAt(currPageIdx_); }
    //const Page& pagesAt(int pageNo);
  private:
    deque<Page> pages_;
    int currPageIdx_;
};

int main() {
    Book book;
    cout << book.pagesAt(3).first.getNum() << endl;
    cout << book.currPages().first.getNum() << endl;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-29 18:13:54

引用的vector (或任何STL容器)确实不是一个好主意,当您简单地查看任何STL容器(ISO C++03 23.1lib.container.requirements)的元素类型T的需求时,这一点是显而易见的。它一开始就说“容器是存储其他对象的对象”。我们可以到此为止,因为引用不是C++中的对象(与指针不同;请注意,C++术语中的“对象”并不意味着“类的实例”!)。但是,此外,它要求TAssignable,其要求引用类型T& -如果T本身是某个引用类型U&,则构造的类型将是U& &,这(对引用的引用)在C++中是非法的。

如果你真的想拥有一个不管理对象生存期的容器,那么你应该使用一个指针容器。如果你更喜欢引用的安全性(例如,缺少指针算法和空值),你可以使用std::tr1::reference_wrapper<T>类,它是可复制构造和可赋值的引用包装器。

票数 3
EN

Stack Overflow用户

发布于 2009-12-29 18:16:25

关于海报的无限循环问题:您的代码无限循环,因为在Book构造函数中计数器numPages永远不会减少,因此while语句永远不会停止,直到内存耗尽。

通过使用for循环通常可以更容易地发现这些类型的错误:

代码语言:javascript
复制
Book() : currPageIdx_(3) {
  for(int numPages = 0; numPages < 5; ++numPages) {
    pages_.push_back(Page());
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1973815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档