c++ 头文件 cpp文件的关系

2025-03-21 06:10:49
推荐回答(2个)
回答1:

template应该把实现和定义放到一个文件
因为cpp在编译时会生成库(或临时)文件,但很显然在T未确定的情况下编译器很难确定你会链接何种类型
ps:作为实验,你可以试一下这种方式,也许会帮助理解。在ListNode.cpp将T明确为int,编译就可以通过了,但是float,double等其他类型仍然会错 ,比如
原来:
template
void ListNode::SetLink(ListNode *next)
{
link = next;
}
改为:
void ListNode::SetLink(ListNode *next)
{
link = next;
}

-----------------------------------------------
补充:
你这个错误是链接错误,也就是说链接时编译器找不到类型明确(T=int)之后的GetData具体版本,原因在于ListNode.cpp中没有具体类型信息,无法编译成可执行代码
-----------------------------------------------
你include了cpp和你把cpp内容放入h里面是一回事,那个后缀在你明确向编译器提供文件名时是没有用的,即使改成.abc也可以
当然,这里问题的本质还是在于改之前和改之后编译过程不一样,改之前将cpp单独编译(但由于类型未定无法正常编译成目标代码),main.cpp编译成.o文件,然后连接成执行代码;改之后只生产main.cpp的.o文件,然后链接

回答2:

你的GetData() 返回的是一个引用,所以函数体里面应该写成 return *data;

不过对程序员来说,返回引用不是很明智的,常常出错的。建议少用!