【问题标题】:C++: unimplemented: non-static data member initializersC++:未实现:非静态数据成员初始化器
【发布时间】:2025-12-25 14:35:11
【问题描述】:

我有以下代码:

#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

struct node{
    vector<int> vic;
    bool visitato = false;
};

int main (){
    vector<node> grafo;
    ifstream in("input.txt");
    int n, m, s, from, to;
    in >> n >> m >> s;
    grafo.resize(n);
    for (int i = 0; i < m; i++){        
        in >> from >> to;
        grafo[from].vic.push_back(to);
    }
    for (int i = 0; i < grafo.size(); i++)
        for(int j = 0; j < grafo[i].vic.size(); j++)
            cout << "From node " << i << " to node " << grafo[i].vic[j] << endl;
}

并且(在 Ubuntu 上)我输入以下命令:

/usr/bin/g++ -DEVAL -static -O2 -o visita visita.cpp -std=c++0x

我收到以下错误:

visita.cpp:10:21: sorry, unimplemented: non-static data member initializers
visita.cpp:10:21: error: ISO C++ forbids in-class initialization of non-const static member ‘visitato’

在我家它工作得很好,但在大学里却不行。我们的老师已经发布了要执行的命令。那为什么它在大学里不起作用,而在我家却起作用?

【问题讨论】:

  • g++ 的不同版本。你的比较晚,支持 C++11 的类内初始化特性,大学不支持。
  • 它告诉你出了什么问题。你大学的编译器不支持 C++11 非静态数据成员初始化器。 REF: visita.cpp:10:21: 抱歉,未实现:非静态数据成员初始化器
  • 添加到@AlexanderBrevig 的评论中,struct node 不是静态的,因此数据成员 visitato 的初始化程序 = false 未在您在家使用的 GCC 中实现。使用gcc --version 获取家庭和大学的编译器版本。此外,使用-std=c++11,因为-std=c++0x 已被弃用。
  • 好吧,我的 gcc 版本在 uni 是 4.6.3。但是,如果他知道我们必须在这些 pc 上工作,他为什么要告诉我们使用该命令? ... :\ PS,我尝试输入 std=c++11 但它不起作用:cc1plus: error: unrecognized command line option ‘-std=c++11
  • @bogALT:确实,那个古老的编译器不会识别c++11,只能识别旧名称c++0x,现在已弃用。您应该在现代编译器上指定 c++11,如果这不起作用,则不要期望完整的 C++11 支持。

标签: c++ struct compiler-errors non-static


【解决方案1】:

GCC 4.7 以来可用的非静态数据成员初始化程序。因此,请检查您的 GCC 版本。

【讨论】:

    【解决方案2】:

    用这段代码解决了:

    struct node{
        vector<int> vic;
        bool visitato;
        node() : visitato(false) {}    
    };
    

    【讨论】: