ошибка: переменная или поле 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) уже есть определение / объявление «системы», я предлагаю вам решить эту проблему в первую очередь. Это также хорошая форма для демонстрации всех результатов, помогает людям давать лучшие советы.

Другие вопросы по тегам