调用模板类出现undefined reference to的情况及解决方案

在剑指offer的练习10中,需利用两个栈实现队列的效果。在第一个版本中,我完成了int类型的效果实现。

9_Use_Two_Stack_Realization_Queue.h:

#ifndef Use_Two_Stack_Realization_Queue_H
#define Use_Two_Stack_Realization_Queue_H
#include "header.h"

class stack_to_queue
{
private:
    stack<int> stack_base;
    stack<int> stack_queue;
public:
    stack_to_queue();
    ~stack_to_queue();
    void appendTail(int value);
    void deleteHead();
};

9_Use_Two_Stack_Realization_Queue.cpp:

#include "9_Use_Two_Stack_Realization_Queue.h"

stack_to_queue::stack_to_queue()
{
}

stack_to_queue::~stack_to_queue()
{
}

void stack_to_queue::appendTail(int value)
{
    stack_base.push(value);
    cout<<"now the queue have "<<stack_base.size()+stack_queue.size()<<" size"<<endl;
}
void stack_to_queue::deleteHead()
{
    if (stack_queue.empty())
    {
        while (!stack_base.empty())
        {
            stack_queue.push(stack_base.top());
            stack_base.pop();
        }
    }
    if (stack_queue.empty())
        cout << "there have no message in queue" << endl;
    else
    {
        cout << "delete the head value:" << stack_queue.top() << endl;
        stack_queue.pop();
    }
    cout<<"now the queue have "<<stack_base.size()+stack_queue.size()<<" size"<<endl;
}

这时代码可以正常地被测试:

void test9()
{
    stack_to_queue st;
    st.appendTail(1);
    st.appendTail(2);
    st.appendTail(3);
    st.deleteHead();
    st.deleteHead();
    st.appendTail(4);
    st.appendTail(5);
    st.deleteHead();
    st.deleteHead();
    st.deleteHead();
    st.deleteHead();
}
int main(int argc, char *argv[])
{
    clock_t start,end;
    start=clock();
    test9();
    end=clock();
    cout<<endl<<"this function using :"<<double(end-start)/CLOCKS_PER_SEC<<"s"<<endl;
    return 0;
}
root@cephtest:/home/jzoffer# ./test 
now the queue have 1 size
now the queue have 2 size
now the queue have 3 size
delete the head value:1
now the queue have 2 size
delete the head value:2
now the queue have 1 size
now the queue have 2 size
now the queue have 3 size
delete the head value:3
now the queue have 2 size
delete the head value:4
now the queue have 1 size
delete the head value:5
now the queue have 0 size
there have no message in queue
now the queue have 0 size

this function using :0.000263s

然而目前的代码只能接受int类型。进一步的,使用模板template <typename T>来使代码能够接受不同类型。然而修改后编译程序报错:

root@cephtest:/home/jzoffer# make
Scanning dependencies of target test
[ 11%] Building CXX object CMakeFiles/test.dir/10_Fibonacci_Sequence.cpp.o
[ 22%] Building CXX object CMakeFiles/test.dir/4_FindNFrom2Arry.cpp.o
[ 33%] Building CXX object CMakeFiles/test.dir/5_Change_Space_To_Otherchars.cpp.o
[ 44%] Building CXX object CMakeFiles/test.dir/6_EndToFirst_From_LinkNode.cpp.o
[ 55%] Building CXX object CMakeFiles/test.dir/7_Rebuild_BinaryTree.cpp.o
[ 66%] Building CXX object CMakeFiles/test.dir/8_FindNextNode_From_Tree.cpp.o
[ 77%] Building CXX object CMakeFiles/test.dir/9_Use_Two_Stack_Realization_Queue.cpp.o
[ 88%] Building CXX object CMakeFiles/test.dir/main.cpp.o
[100%] Linking CXX executable test
CMakeFiles/test.dir/main.cpp.o: In function `test9()':
main.cpp:(.text+0x497): undefined reference to `stack_to_queue<int>::stack_to_queue()'
main.cpp:(.text+0x4ab): undefined reference to `stack_to_queue<int>::appendTail(int)'
main.cpp:(.text+0x4bf): undefined reference to `stack_to_queue<int>::appendTail(int)'
main.cpp:(.text+0x4d3): undefined reference to `stack_to_queue<int>::appendTail(int)'
main.cpp:(.text+0x4e2): undefined reference to `stack_to_queue<int>::deleteHead()'
main.cpp:(.text+0x4f1): undefined reference to `stack_to_queue<int>::deleteHead()'
main.cpp:(.text+0x505): undefined reference to `stack_to_queue<int>::appendTail(int)'
main.cpp:(.text+0x519): undefined reference to `stack_to_queue<int>::appendTail(int)'
main.cpp:(.text+0x528): undefined reference to `stack_to_queue<int>::deleteHead()'
main.cpp:(.text+0x537): undefined reference to `stack_to_queue<int>::deleteHead()'
main.cpp:(.text+0x546): undefined reference to `stack_to_queue<int>::deleteHead()'
main.cpp:(.text+0x555): undefined reference to `stack_to_queue<int>::deleteHead()'
main.cpp:(.text+0x564): undefined reference to `stack_to_queue<int>::~stack_to_queue()'
main.cpp:(.text+0x588): undefined reference to `stack_to_queue<int>::~stack_to_queue()'
collect2: error: ld returned 1 exit status
CMakeFiles/test.dir/build.make:276: recipe for target 'test' failed
make[2]: *** [test] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/test.dir/all' failed
make[1]: *** [CMakeFiles/test.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

有三种方法可以解决该问题,分别是:

1、在.cpp文件的最尾,实例化所需要的类型:

template class stack_to_queue<int>;
template class stack_to_queue<char>;

2、将.cpp文件中的代码全部移动到.h文件中。相当于不再见声明和实现分离。

3、将.cpp文件重命名为xxx.h文件,然后在原来的.h文件中包含该xxx.h头文件

以上方法任选一种即可使程序正常运行。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: "undefined reference to" 是一个编译错误,通常是由于缺少库文件或函数定义引起的。解决方法包括: 1. 确保库文件已经正确安装并且在编译时已经链接到程序中。 2. 检查函数定义是否正确,包括函数名、参数和返回类型等。 3. 如果使用了第三方库,确保已经正确包含头文件并链接库文件。 4. 如果使用了多个源文件,确保所有源文件都已经正确编译并链接到程序中。 5. 如果使用了模板或者宏定义,确保它们已经正确展开并且没有语法错误。 6. 如果使用了静态变量或者全局变量,确保它们已经正确定义并且没有重复定义。 总之,解决 "undefined reference to" 错误需要仔细检查代码和编译选项,找出问题所在并进行修复。 ### 回答2: undefined reference to(未定义的引用)是C++程序编译时最常见的错误之一。这种错误通常会出现在缺少头文件或者库文件的情况下。 解决undefined reference to错误的方法主要有以下几种: 1.头文件或者库文件没有包含。在编写程序代码时,使用到的函数、变量等需要在程序中被声明,否则编译器将会无法识别这些内容。因此,在写代码时,需要引入相应的头文件或者库文件。 2.库不匹配。当使用库文件时,需要检查库文件是否与系统环境相匹配。在Linux系统中,不同的库有不同的命名规则,因此需要确认库文件是否命名正确,是否放在正确的位置。 3.函数定义不完整。当出现未定义的引用时,可能是函数定义不完整导致的。检查代码中函数实现的完整性,确保没有遗漏任何必要元素。 4.变量调用不正确。当调用某个变量时,需要确认变量是否已经被正确的定义。如果没有被定义,就会出现undefined reference to错误。 总之,当出现undefined reference to错误时,尽管看起来比较恼人,但通常只需要检查上述几种错误原因,并对代码进行相应的修正,就能够充分解决问题。 ### 回答3: 当你编译程序时,可能会遇到“未定义引用”的错误,这通常是由于缺少某些库或文件的定义或链接问题引起的。最常见的解决方法是确保你包含了正确的库文件和头文件,以及正确地链接这些文件。以下是一些可能有用的解决方法: 1. 确保源代码文件中包含了你需要使用的所有头文件和库文件,并在编译命令中正确地链接这些文件。 2. 确保库文件被正确地安装和配置。如果你自己编译库文件,要确保编译和安装过程正确无误。 3. 检查你的编译器是否支持你需要使用的库文件。有时候,你的编译器版本或操作系统版本可能不支持某些库文件。 4. 检查是否有任何拼写错误或其他语法错误,并在需要的地方进行更正。 5. 如果你使用的是C++程序,则可能需要加上“extern C”语句来解决链接问题。这个语句可以将C++函数的名称转换为C函数的名称,以允许C++函数可以与C函数互相调用。 6. 最后,如果你不知道如何解决这个问题,可以在网络上搜寻相关的解决方案。许多社区和论坛都有关于处理“未定义引用”的问题的讨论,你可以从中找到有用的解决方案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值