gpt4 book ai didi

c++ - 与模板类的链接错误

转载 作者:行者123 更新时间:2023-11-28 08:07:01 25 4
gpt4 key购买 nike

我有一个类需要在各种不同的上下文中调用外部函数。我想保持灵 active ,所以我使用了一个接口(interface)(受第 3 版 Numerical Recipes 的启发)应该与仿函数、函数指针等一起使用。一个简化的示例如下所示:

class MyClass {
public:
template <class T>
MyClass(T &f_) { f = f_; }
private:
int (*f)(int);
};

int myFn(int i) {
return i % 100;
}

int main() {
MyClass test(myFn);
return 0;
}

到目前为止一切顺利; g++ 毫无怨言地编译它。在我的实际应用程序中,有更多的代码,所以我把事情分成了多个文件。例如,

测试2.h:

#ifndef __test2__
#define __test2__

class MyClass {
public:
template <class T>
MyClass(T &f_);
private:
int (*f)(int);
};

#endif

测试2.cpp:

#include "test2.h"

template <class T>
MyClass::MyClass(T &f_) {
f = f_;
}

主要.cpp:

#include "test2.h"

int myFn(int i) {
return i % 100;
}

int main() {
MyClass test(myFn);
return 0;
}

当我尝试使用 g++ test2.cpp main.cpp 编译它时,出现以下链接错误:

/tmp/ccX02soo.o: In function 'main':
main.cpp:(.text+0x43): undefined reference to `MyClass::MyClass<int ()(int)>(int (&)(int))'
collect2: ld returned 1 exit status

g++ 似乎不知道我也在尝试编译 test2.cpp。关于这里可能发生的事情有什么想法吗?

谢谢,

--克雷格

最佳答案

模板类的实现必须对所有使用它们的翻译单元可见,除非它们是完全专用的。

这意味着您必须在 header 中移动实现:

//test2.h
#ifndef __test2__
#define __test2__

class MyClass {
public:
template <class T>
MyClass(T &f_);
private:
int (*f)(int);
};

template <class T>
MyClass::MyClass(T &f_) {
f = f_;
}

#endif

关于c++ - 与模板类的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10103040/

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