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