C ++片段可以使用MSVC但不能使用g ++

时间:2015-07-06 16:19:29

标签: c++ gcc combinatorics

我是C ++的新手,我尝试调整一个程序片段来生成“弱组合”或在stackoverflow上找到的Multisets,但我跑得很坦白 - 因为几个小时就遇到了问题。

首先,该程序在MSVC下没有任何投诉 - 但在gcc上没有。

关键是,我已经在stackoverflow上阅读了很多这样的文章,关于gcc和msvc的不同行为,我已经理解,msvc在处理这个问题时更加“自由”了情况和gcc更“严格”。我也理解,应该“不要将非const引用绑定到临时(内部)变量。”

但是我很抱歉,我无法解决这个问题并让这个程序在gcc下运行 - 从那几个小时开始。

并且 - 如果可能 - 第二个问题:我必须引入一个全局变量 total,虽然效果很好,但据说是“邪恶的”。我需要这个总值,但我找不到具有非全局范围的解决方案。

非常感谢你的帮助。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int total = 0;

string & ListMultisets(unsigned au4Boxes, unsigned au4Balls, string & strOut = string(), string strBuild = string()) {
  unsigned au4;
  if (au4Boxes > 1) for (au4 = 0; au4 <= au4Balls; au4++)
  {
    stringstream ss;
    ss << strBuild << (strBuild.size() == 0 ? "" : ",") << au4Balls - au4;
    ListMultisets(au4Boxes - 1, au4, strOut, ss.str());
  }
  else
  {
    stringstream ss;
    ss << mycount << ".\t" << "(" << strBuild << (strBuild.size() == 0 ? "" : ",") << au4Balls << ")\n";
    strOut += ss.str();
    total++;
  }

return strOut;
}

int main() {
  cout << endl << ListMultisets(5,3) << endl;
  cout << "Total: " << total << " weak compositions." << endl;
  return 0;
}

2 个答案:

答案 0 :(得分:0)

删除strOut参数的默认值。

在main中创建一个字符串并将其传递给函数。

将函数的返回类型更改为int。

使一个局部变量ListMultisets()。返回总数而不是strOut(您将返回字符串值strOut作为参考参数。)

新ListMultisets的签名如下:

int ListMultisets(unsigned au4Boxes, unsigned au4Balls, string & strOut) 

我会让你弄清楚实施情况。它既简单又有教育意义。

您的新主要功能如下:

int main() {
  string result;
  int total = ListMultisets(5,3, result);
  cout << endl << result << endl;
  cout << "Total: " << total << " weak compositions." << endl;
  return 0;
}

答案 1 :(得分:0)

C ++要求对未命名的临时(如string())的引用参数必须是 const引用 r值引用

这些引用类型中的任何一个都可以保护您不会修改您未实现的变量将在当前表达式中被销毁。

根据您的需要,可能会将其设为值参数:

string ListMultisets( ... string strOut = string() ... ) {

或它可以使它成为函数局部变量:

string ListMultisets(...) {
string strOut;

在您的示例程序中,任一更改都可以。