初始化结构矢量时遇到问题。
简化代码:
#include <vector>
#include <iostream>
int main() {
struct info
{
int num;
bool b;
info()
: num(1), b(false){}
};
std::vector<info> stuff = std::vector<info>(10);
//Try 1
stuff[5] = info();
stuff[5].num = 4;
//Try 2
info inf;
inf.num = 5;
stuff.push_back(inf);
std::cout << "\nstuff[5].num=" << stuff[5].num
<< "\nstuff[10].num=" << stuff[10].num;
return 0;
}
不确定为什么这不起作用。看起来它应该很简单,但每次尝试后所有Visual Studio调试器都有:stuff [(any)] = {num = ??? b = ???}
提前感谢您的帮助。
答案 0 :(得分:2)
以下内容不适用于评论。
该程序无法正常运行,因为它不完整。始终给出一个显示问题的完整最小示例。打印出以下程序
stuff[5].num=4
stuff[10].num=5
正如所料。
#include <iostream>
#include <vector>
struct info
{
int num;
bool b;
info()
: num(1), b(false){}
};
int main() {
std::vector<info> stuff = std::vector<info>(10);
//Try 1
stuff[5] = info();
stuff[5].num = 4;
//Try 2
info inf;
inf.num = 5;
stuff.push_back(inf);
std::cout << "\nstuff[5].num=" << stuff[5].num
<< "\nstuff[10].num=" << stuff[10].num;
return 0;
}
这个问题非常有趣。从OP告诉我们的内容来看,原始代码是这样的:
#include <iostream>
#include <vector>
int main() {
struct info
{
int num;
bool b;
info()
: num(1), b(false){}
};
std::vector<info> stuff = std::vector<info>(10);
//Try 1
stuff[5] = info();
stuff[5].num = 4;
//Try 2
info inf;
inf.num = 5;
stuff.push_back(inf);
std::cout << "\nstuff[5].num=" << stuff[5].num
<< "\nstuff[10].num=" << stuff[10].num;
return 0;
}
/*
Local Variables:
compile-command: "g++ -std=c++11 test.cc -o a.exe"
End:
*/
如果使用g++
编译并且没有选项-std=c++11
,则会收到以下错误消息:
g++ -g /temp/test.cc -o /temp/test.exe && /temp/test.exe
/temp/test.cc: In function ‘int main()’:
/temp/test.cc:15:18: error: template argument for ‘template<class> class std::allocator’ uses local type ‘main()::info’
std::vector<info> stuff = std::vector<info>(10);
^
/temp/test.cc:15:18: error: trying to instantiate ‘template<class> class std::allocator’
/temp/test.cc:15:18: error: template argument 2 is invalid
...
但是,N3797的Section [class.local]告诉我们本地类没有任何问题。因此,我使用-std=c++11
g++
选项进行了重试。
这编译得很好,并给出了预期的结果。
另外使用-g
标志进行编译以包含调试信息,并且调试与g++
一起使用。
以下gdb
会话的部分输出刚好在<<
运算符之前运行:
(gdb) print stuff[5]
$2 = (__gnu_cxx::__alloc_traits<std::allocator<main()::info> >::value_type &) @0x60003c388: {num = 4, b = false}
(gdb) print stuff[10]
$3 = (__gnu_cxx::__alloc_traits<std::allocator<main()::info> >::value_type &) @0x60003c3b0: {num = 5, b = false}
正如人们所看到的,它会给出预期的结果。
Visual Studio 2010编译它并且控制台中的输出很好。在调试器中没有什么可看的。 stuff
- 成员在调试器中是废弃的,即使程序是在调试模式下编译的。