错误:变量或字段"MetroHastings"声明为无效



我是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;
}

我认为它的问题与类系统的构建有关,后者在"内部";利比里亚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文件中定义函数,我不知道为什么编译器会把它误认为是变量声明。提前感谢:(

名为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;在这里没有帮助,用<cstdlib>替换<stdlib.h>也没有帮助。

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

类名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>

相关内容

  • 没有找到相关文章

最新更新