为什么调试器无法在deque中显示/观察结构?

时间:2014-04-03 08:33:45

标签: c++ visual-studio visual-studio-debugging

当我调试下面的一小段代码时,visual studio调试器没有显示我推入struct的{​​{1}}的值,它只显示所有字段名称=? ?? 即可。所有其他var都被正确观看了!

有人已经有同样的问题吗?

deque

注意:我对push_back使用了增强范围适配器,但它与typedef struct ToTestDrift{ int num; uint64_t pts; ToTestDrift(int n, uint64_t ts): num(n), pts(ts) {} ToTestDrift(const ToTestDrift& ro):num(ro.num), pts(ro.pts) {} } drift_t; ifstream input("test.txt"); std::deque<drift_t> drift; while(!input.eof()) { int framenum; uint64_t pts; input >> pts >> framenum; push_back(drift)(framenum, pts); } 相同!

如果我提取类似于以下代码的值,那么drift.push_back上的watch就可以了......

t

enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

我终于找到了这个奇怪问题背后的原因。

我提供的代码不符合C ++ 98且不应该编译(事实上它不能用 GCC 编译)。原因是我们不能使用本地函数,结构/类定义,模板(容器或其他......),read that post for more info

事实上,在可视化编译器中接受该代码,因为没有结构/类及其字段的ID,调试器有点丢失&#34; ....

我将结构/类定义移到我的函数外面,现在编译器为struct / class创建一个ID,调试器像往常一样工作。

所以而不是

int function() 
{
    typedef struct ToTestDrift{
        int num;
        uint64_t pts;
        ToTestDrift(int n, uint64_t ts): num(n), pts(ts) {}
        ToTestDrift(const ToTestDrift& ro):num(ro.num), pts(ro.pts) {}
    } drift_t;

    ifstream input("test.txt"); 
    std::deque<drift_t> drift; 
    while(!input.eof())
    {
        int framenum;  uint64_t pts;
        input >> pts >> framenum;  
        push_back(drift)(framenum, pts);
    }
}

typedef struct ToTestDrift{
            int num;
            uint64_t pts;
            ToTestDrift(int n, uint64_t ts): num(n), pts(ts) {}
            ToTestDrift(const ToTestDrift& ro):num(ro.num), pts(ro.pts) {}
        } drift_t;

    int function() 
    {
        ifstream input("test.txt"); 
        std::deque<drift_t> drift; 
        while(!input.eof())
        {
            int framenum;  uint64_t pts;
            input >> pts >> framenum;  
            push_back(drift)(framenum, pts);
        }
    }

注意,代码的第一个版本符合新的C ++ 11,所有新的编译器放宽了这个限制,因此struct / class的本地函数定义应该可以正常使用visual studio 2013。