0

我是 StackOverflow 的新手,对 C++ 很陌生。当我尝试在我的程序“ising.cpp”中定义一个函数时,我遇到了问题。那是身体功能,它还不完整,但它的发展与我的错误无关:

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <time.h>
#include <stdlib.h>
#include "libreria.h"      

using namespace std;


void MetroHastings (system * old_state,int method) {
system new_state;
new_state = *old_state;
}


int main () {

return 0;

}

我认为它与“liberia.h”内部的类系统构造有关的问题:

#ifndef libreria_h
#define libreria_h



using namespace std;

struct vecI_2d {

int nx;
int ny;

};

struct vecD_2d {
   double x;
   double y;

};

struct atom {

  double spin; // 0,1,-1
};


class system {
   double T;
   int i,j;
   double energy;
   double J = 1;
   atom ** particles;   
   public:
   system();    
   system (double T, int ix,int iy);
    void number_particle (int n);
    void ComputeEnergy();
    double ReturnEnergy();
    double CloseEnergy(int ix,int iy);
    double magnetization();
    };

    #endif

类主体定义在“liberia.cc”中:

     #include "libreria.h"      
     #include <iostream>
     #include <cstdlib>
     #include <cmath>
     #include <time.h>
     #include <stdlib.h>

     using namespace std;

     system::system(double T, int sx, int sy) {
     i=sx;
     j=sy;
     int r;
     particles = new atom *[i];
     for (int k=0;k<i;k++) {
        particles[k] = new atom[j];
      }
       for (int kx=0;kx<i;kx++) { 
         for(int ky=0;ky<j;ky++) {
            r = rand()%1;
            if (r==1) {
                particles[kx][ky].spin = 1;
            }
            else {
                particles[kx][ky].spin = -1;
            } 
        }
      }
   }

等等...这是我用来编译的命令:

g++ ising.cpp libreria.cc -o ising

我不明白为什么我会收到这个错误。我总是在我的 cpp 文件中定义函数,我不知道为什么编译器会将其误认为是变量声明。先感谢您 :)

4

2 回答 2

3

您命名的类与具有相同名称system的标准函数冲突。

Clang 发出更好的错误消息:

<source>:47:21: error: must use 'class' tag to refer to type 'system' in this scope
void MetroHastings (system * old_state,int method) {
                    ^
                    class 
.../stdlib.h:78:12: note: class 'system' is hidden by a non-type declaration of 'system' here
using std::system;
           ^

按照 Clang 的建议,重命名该类,或使用class system而不是system引用它。


对于任何想知道的人来说,删除using namespace std;在这里没有帮助,替换<stdlib.h><cstdlib>.

于 2021-11-07T11:11:44.113 回答
1

当一个类和一个函数具有相同的名称时,该函数将隐藏类声明。

您的类名与隐藏类定义system的标准 C 函数冲突。system

来自 C++ 14 标准(3.3.1 声明性区域和范围)

4 给定单个声明区域中的一组声明,每个声明都指定相同的非限定名称

(4.2) — 恰好一个声明应声明一个非 typedef 名称的类名或枚举名,而其他声明应全部引用同一个变量或枚举数,或全部引用函数和函数模板;在这种情况下,类名或枚举名是隐藏的(3.3.10)。[注意:命名空间名称或类模板名称在其声明区域中必须是唯一的(7.3.2,第 14 条)。——尾注]

在这种情况下,您需要使用详细的类说明符,例如

void MetroHastings ( class system * old_state,int method) {
    system new_state;
    new_state = *old_state;
}

此外,您需要使用 C++ 标头名称来代替 C 标头名称,例如

#include <cstdlib>
于 2021-11-07T11:20:20.217 回答