доступ к элементам в пространстве имен, определенном в заголовочном файле - PullRequest
3 голосов
/ 29 января 2020

Я пытаюсь получить доступ к переменным и функциям, определенным в пространстве имен в заголовочном файле. Однако я получаю ошибку: xor.cpp:(.text+0x35): undefined reference to "the function in header file" collect2: error: ld returned 1 exit status. Мне кажется, что после прочтения этого post шаги компиляции в порядке, а также потому, что я могу получить доступ к переменным в этом заголовочном файле, но вызов функции возвращает ошибку, упомянутую выше. У меня вопрос: как я могу получить доступ к этим функциям в пространстве имен с моего основного. cpp? Что я делаю неправильно ?

Случай с классом мне понятен, но здесь я не понимаю, потому что я не должен создавать объект, поэтому просто вызов переднего пространства имен должен быть в порядке (?). Любая помощь будет высоко ценится.

РЕДАКТИРОВАТЬ После изменений, предложенных Maestro, я обновил код следующим образом, но он все равно не работает. Я получаю ту же ошибку. Если я определю using NEAT::trait_param_mut_prob = 6.7;, я получу ошибку: xor.cpp:127:36: error: expected primary-expression before ‘=’ token

Main c ++

#include "experiments.h"
#include "neat.h"
#include <cstring>

int main(){

  const char *the_string = "test.ne";
  bool bool_disp = true;
  NEAT::trait_param_mut_prob;
  trait_param_mut_prob = 6.7;
  NEAT::load_neat_params(the_string ,bool_disp);
  std::cout << NEAT::trait_param_mut_prob << std::endl;
  return 0;
}

neat.h

    #ifndef _NERO_NEAT_H_
    #define _NERO_NEAT_H_

    #include <cstdlib>
    #include <cstring>

    namespace NEAT {
        extern double trait_param_mut_prob;
        bool load_neat_params(const char *filename, bool output = false); //defined HERE 

    }
    #endif

аккуратно. cpp

#include "neat.h"
#include <fstream>
#include <cmath>
#include <cstring>

double NEAT::trait_param_mut_prob = 0;

bool NEAT::load_neat_params(const char *filename, bool output) { 
                    //prints some stuff
                    return false;
                    };

Makefile

neat.o: neat.cpp neat.h
        g++ -c neat.cpp

1 Ответ

3 голосов
/ 29 января 2020

Вы нарушаете «правило ODR» (One-Definition-Rule): вы определили trait_param_mut_prob и load_neat_params два раза один раз в исходном файле neat.cpp и секунду в main.cpp, поэтому просто удалите эти строки из main. cpp:

//double NEAT::trait_param_mut_prob; //NEAT is the namespace 
//bool NEAT::load_neat_params(const char* filename, bool output); //function defined in the namespace 
  • Добавьте #endif в свой заголовок neat.h.
  • , чтобы сделать вашу функцию и переменную доступными в main просто используйте using или полностью квалифицировать вызов, потому что, как я видел, вы намерены повторно объявить их в main, чтобы избежать их полной квалификации: в main:

    int main()
    {
    
        using NEAT::trait_param_mut_prob;
        using NEAT::load_neat_params;
    
        const char* the_string = "test.ne";
        bool bool_disp = true;
        trait_param_mut_prob = 6.7;//works perfectly 
        load_neat_params(the_string, bool_disp);
        // or fully-qualify:
    
        //NEAT::load_neat_params(the_string, bool_disp);
        //NEAT::trait_param_mut_prob = 6.7;//works perfectly 
    }
    
  • Также это ошибочно, что ваша функция load_neat_params не возвращает значение bool. Так что сделайте либо возврат true, либо false.

...