ошибка: переменная или поле 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;
}
Я думаю, проблема связана с созданием системы классов , которая находится внутри "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, я не знаю, почему компилятор ошибочно принимает его за объявление переменной. Заранее спасибо :)
3 ответа
Ваш класс с именем конфликтует со стандартной функцией с тем же именем .
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;
^
Переименуйте класс или используйте
class system
вместо того
system
ссылаться на него, как предлагает Clang.
Для всех, кому интересно, удаление
using namespace std;
здесь не помогает, равно как и замена
<stdlib.h>
с участием
<cstdlib>
.
Когда класс и функция имеют одно и то же имя, функция скрывает объявление класса.
Имя вашего класса конфликтует со стандартной функцией C
Из стандарта 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>
во-первых, в одном из предыдущих файлов заголовков (stdlib.h) уже есть определение / объявление «системы», я предлагаю вам решить эту проблему в первую очередь. Это также хорошая форма для демонстрации всех результатов, помогает людям давать лучшие советы.