我正在尝试访问头文件中命名空间中定义的变量和函数。但是,我得到了错误:xor.cpp:(.text+0x35): undefined reference to "the function in header file" collect2: error: ld returned 1 exit status。在我看来,在读取此post之后,编译步骤就可以了,并且还因为我可以访问此头文件中的变量,但是调用该函数将返回上述错误。我的问题是:如何从main.cpp访问 namespace 中的那些函数?我究竟做错了什么 ?
类的情况对我来说很清楚,但是在这里我不明白,因为我不应该创建对象,因此只需在前面调用 namespace 就可以了(?)。
编辑
在Maestro建议更改之后,我已经按照以下方式更新了代码,但仍然无法正常工作。我得到的错误是相同的。如果我定义using NEAT::trait_param_mut_prob = 6.7;,则会出现错误:xor.cpp:127:36: error: expected primary-expression before ‘=’ token 主要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
neat.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

最佳答案

您正在打破“ODR规则”(一个定义规则):您已经在源文件trait_param_mut_prob中两次定义了load_neat_paramsneat.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中重新声明它们以避免完全限定它们:in 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值也是错误的。因此,使其返回truefalse
  • 10-05 22:27