C++ 片段可以使用 MSVC 但不能使用 g++
C++ snippet OK with MSVC but not with g++
我是 C++ 的新手,我尝试改编一个程序片段,它生成 "weak compositions" 或在 Whosebug 上找到的 Multisets 但我 运行 - 坦率地说 - 因为小时陷入问题。
首先,程序 运行 在 MSVC 下没有任何投诉 - 但在 gcc 上没有。
重点是,我在 Whosebug 上阅读了很多关于 gcc 和 msvc 的不同行为的文章,并且我明白了,msvc 有点多 "liberal"在处理这种情况时和gcc比较"strict"。我也明白了,应该"not bind a non-const reference to a temporary (internal) variable."
但是很抱歉,我无法修复它并让这个程序在 gcc 下运行 - 又是几个小时后。
并且 - 如果可能的话 - 第二个问题:我必须引入一个全局变量
total
,据说是"evil",虽然效果很好。我需要这个总值,但是我找不到非全局范围的解决方案。
非常感谢大家的帮助。
#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;
}
删除 strOut 参数的默认值。
在 main 中创建一个字符串并将其传递给函数。
将函数的return类型改为int。
将 total 设为局部变量 ListMultisets()。 Return total 而不是 strOut(您 return 将字符串值 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;
}
C++ 要求未命名临时变量(如 string()
)的引用参数必须是 const
引用 或 r 值参考.
这些引用类型中的任何一种都会保护您免于修改您没有意识到会在当前表达式中被破坏的变量。
根据您的需要,它可以使它成为一个值参数:
string ListMultisets( ... string strOut = string() ... ) {
或者它可以使它成为函数局部变量:
string ListMultisets(...) {
string strOut;
在您的示例程序中,任一更改都可以。
我是 C++ 的新手,我尝试改编一个程序片段,它生成 "weak compositions" 或在 Whosebug 上找到的 Multisets 但我 运行 - 坦率地说 - 因为小时陷入问题。
首先,程序 运行 在 MSVC 下没有任何投诉 - 但在 gcc 上没有。
重点是,我在 Whosebug 上阅读了很多关于 gcc 和 msvc 的不同行为的文章,并且我明白了,msvc 有点多 "liberal"在处理这种情况时和gcc比较"strict"。我也明白了,应该"not bind a non-const reference to a temporary (internal) variable."
但是很抱歉,我无法修复它并让这个程序在 gcc 下运行 - 又是几个小时后。
并且 - 如果可能的话 - 第二个问题:我必须引入一个全局变量
total
,据说是"evil",虽然效果很好。我需要这个总值,但是我找不到非全局范围的解决方案。
非常感谢大家的帮助。
#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;
}
删除 strOut 参数的默认值。
在 main 中创建一个字符串并将其传递给函数。
将函数的return类型改为int。
将 total 设为局部变量 ListMultisets()。 Return total 而不是 strOut(您 return 将字符串值 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;
}
C++ 要求未命名临时变量(如 string()
)的引用参数必须是 const
引用 或 r 值参考.
这些引用类型中的任何一种都会保护您免于修改您没有意识到会在当前表达式中被破坏的变量。
根据您的需要,它可以使它成为一个值参数:
string ListMultisets( ... string strOut = string() ... ) {
或者它可以使它成为函数局部变量:
string ListMultisets(...) {
string strOut;
在您的示例程序中,任一更改都可以。