gpt4 book ai didi

c++ - 如果模板类构造函数和成员函数的定义与其使用分开,则 G++ 链接器找不到它们

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:58 26 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Why can templates only be implemented in the header file?

在开发具有某种类型意识的小型解析器时,我遇到了以下难题。简而言之:

GNU g++“忘记”模板成员函数定义,除非它在使用它的同一文件中定义

有什么想法吗?

案卷

为了隔离问题,我将代码精简为三个文件:

头文件Temple.hpp:

#ifndef _TEMPLE
#define _TEMPLE

template <class T> class Temple {
private:
T deity;
public:
Temple ( T value );
T see ();
};

#endif

然后对应的C++实现文件Temple.cpp:

#include "Temple.hpp"
template <class T> Temple<T>::Temple ( T value ) : deity( value ) {}
template <class T> T Temple<T>::see () { return deity; }

最后一个主应用程序调用文件 templetest.cpp 中的内容:

#include "Temple.hpp"
int main () {
bool b(false);
Temple<bool> t( b );
t.see();
}

应该发生的是局部变量 Temple<bool> t构造然后提供(模板扩展)方法bool see()由模板定义。

编译失败☹

但是,当我尝试使用

编译C++源代码时
g++ *.cpp

(或者也明确命名文件),我在 gcc 版本 4.2.1 上遇到链接器错误:

/tmp//ccWAFJDF.o(.text+0x24): In function `main':
: undefined reference to `Temple<bool>::Temple(bool)'
/tmp//ccWAFJDF.o(.text+0x2f): In function `main':
: undefined reference to `Temple<bool>::see()'
collect2: ld returned 1 exit status

在 gcc 4.0.1 上稍微不那么冗长:

/usr/bin/ld: Undefined symbols:
Temple<bool>::see()
Temple<bool>::Temple(bool)
collect2: ld returned 1 exit status

无论如何,由此我得出结论,templetest.cpp 既不能访问具体模板类的构造函数,也不能访问具体模板类的成员函数。

实际编译☻

到目前为止很糟糕,但还有另一种编译方式,即将所有代码放入一个源文件中,然后进行编译。令人惊讶的是,这进展顺利。您可以简单地使用 stdin-streaming 尝试该方法:

cat *.cpp | g++ -x c++ -

如果将文件Temple.cpp 手动合并到Temple.hpp 中,结果同样成功:

template <class T> class Temple {
private:
T deity;
public:
Temple ( T value );
T see ();
};

template <class T> Temple<T>::Temple ( T value ) : deity( value ) {}
template <class T> T Temple<T>::see () { return deity; }

随后使用

编译
g++ templetest.cpp

看来GNU CC只能记住Temple.cpp中的成员函数定义如果在同一个文件中就属于模板类。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com