未定义对已定义函数的引用

20 浏览
0 Comments

未定义对已定义函数的引用

我遇到了一个非常奇怪的错误:我有一对包含一些函数和常量的.h和.cpp文件。当我尝试编译它时,g++会报“未定义的引用”错误。函数的原型和定义似乎是一样的。我已经将除了必要的行之外的所有内容都注释掉了,但是g++仍然对此抱怨。\n我的程序目前(在注释掉所有内容之后):\nmain.cpp\n

#include "a.h"
int main(){
    makehex(10);
    return 0;
}

\na.h\n

#include 
#include 
#ifndef __A___
static const std::string b = "01";
static const std::string d = b + "23456789";
static const std::string h = d + "abcdef";
template  std::string makehex(T value, unsigned int size = 2 * sizeof(T));
#endif

\na.cpp\n

#include "a.h"
template  std::string makehex(T value, unsigned int size){
    // Changes a value to its hexadecimal string
    if (!size){
        std::stringstream out;
        out << std::hex << value;
        return out.str();
    }
    std::string out(size, '0');
    while (value && size){
        out[--size] = h[value & 15];
        value >>= 4;
    }
    return out;
}

\n只有一个函数。我不明白为什么会出现这个错误。\n我使用`g++ -std=c++11 main.cpp a.cpp`进行编译,得到以下错误:\n

main.cpp:(.text+0x1a): undefined reference to `std::string makehex(int, unsigned int)'
collect2: error: ld returned 1 exit status

\n是因为模板吗?如果是,我该如何修复它?

0
0 Comments

Undefined reference to defined function这个问题出现的原因是在main函数中调用了一个模板函数makehex,但是在编译main.cpp文件时,虽然包含了"a.h"头文件,可以访问到该函数的声明,但是无法访问到函数的定义,因为函数的定义在另一个文件a.cpp中,没有被包含进来。

解决这个问题的短期方法是在main.cpp中加入#include "a.cpp",这样可以将函数的定义包含进来。但是从长远来看,更好的解决方法是将模板函数的定义放在头文件(.h)中,而不是在.cpp文件中。(这个方法不适用于普通函数/类等)

在C++中,模板函数只有在实例化时才会被编译器生成,因此需要在使用模板函数之前先进行实例化操作。在main函数中调用makehex(10)时,实际上是在尝试实例化模板函数makehex。

如果在main.cpp文件中已经包含了"a.h"头文件,那么可以访问到makehex函数的声明,但是无法访问到makehex函数的定义。因此,编译器在链接阶段会报错,提示找不到makehex函数的定义,即undefined reference to makehex。

解决这个问题的短期方法是在main.cpp中加入#include "a.cpp",这样可以将a.cpp文件中的makehex函数定义包含进来,编译器就能找到makehex函数的定义了。

然而,更好的解决方法是将模板函数的定义放在头文件(.h)中,而不是在.cpp文件中。这样,编译器在编译main.cpp时就能够直接访问到makehex函数的定义,不再报错。

需要注意的是,这个方法只适用于模板函数,普通函数和类的定义还是应该放在.cpp文件中,遵循常规的编写方式。

0
0 Comments

在编程中,当出现"Undefined reference to defined function"的错误时,通常是因为编译器无法找到函数的定义。对于模板(templates)来说,它们本身并不是代码,而是告诉编译器如何生成其他部分程序可以使用的代码。为了让编译器能够自动完成这个过程,它必须在实例化的地方看到模板的定义。

然而,在现有的设置中,在main.cpp文件中只有makehex<T>()的声明是可见的,而makehex<T>()的实际定义却存在于a.cpp文件中,这是main.cpp在编译期间不知道的(它们处于不同的编译单元)。解决这个问题的简单方法是将makehex<T>()的实现从a.cpp移动到a.h文件中。

这样做的目的是让编译器能够在编译期间找到模板的定义,从而避免"Undefined reference"错误的出现。通过将模板的定义放在头文件中,可以确保在实例化时可以访问到模板的定义,从而使编译器能够生成所需的代码。

总结起来,当出现"Undefined reference to defined function"的错误时,原因通常是因为编译器无法找到函数的定义。对于模板来说,这个问题可以通过将模板的定义放在头文件中来解决。这样可以确保在实例化时可以访问到模板的定义,从而使编译器能够生成所需的代码。

0
0 Comments

(Undefined reference to defined function)这个问题出现的原因是常见的模板错误。编译器在编译时需要知道模板的定义,因此模板函数的定义必须在头文件中。或者,模板的特化必须在.cpp文件中实现。

这个问题的解决方法就是将模板函数的定义放在头文件中,或者将模板的特化实现放在.cpp文件中。

例如,下面的代码中的makehex函数是一个模板函数:

template <typename T> std::string makehex(T value, unsigned int size) {
    // 模板函数的实现
}

如果将这个模板函数的定义放在.cpp文件中,而不是头文件中,就会出现(Undefined reference to defined function)的错误。解决办法是将模板函数的定义放在头文件中。

另外,如果需要对模板进行特化,特化的实现也应该放在.cpp文件中,而不是头文件中。特化的实现可以是对模板函数的具体类型进行特殊处理。

总之,解决(Undefined reference to defined function)的问题的关键是将模板函数的定义放在头文件中,或者将模板的特化实现放在.cpp文件中。这样编译器在编译时才能正确地找到模板的定义和特化的实现,避免出现未定义引用的错误。

0