C++类构造函数中的函数指针
Function pointers in C++ class constructor
我有一个模板化的类,它有一个接受单个参数的构造函数;指向采用第二模板类型的参数的函数的函数指针。并返回第一模板类型的元素。
这是代码:
cache_controller.hpp:
template<class TYPE, class KEY>
class cache
{
private:
TYPE (*create_func)(KEY);
public:
cache(TYPE (*func)(KEY));
};
extern sf::Texture * create_texture(std::string path);
cache_controller.cpp:
template<class TYPE, class KEY>
cache<TYPE, KEY>::cache(TYPE (*func)(KEY))
{
this->create_func = func;
}
sf::Texture * create_texture(std::string path)
{
sf::Texture * tex_p = new sf::Texture;
tex_p->loadFromFile(path);
return tex_p;
}
测试代码:
cache<sf::Texture *, std::string> tcache(&create_texture);
然而,当我链接时,我得到了这个错误:
[Linker error] main.cpp:11: undefined reference to `cache<sf::Texture*, std::string>::cache(sf::Texture* (*)(std::string))'
当然,如果有任何更简单的方法来实现具有任意键、值和创建函数的对象缓存,我都会耳熟能详。
在.cpp
文件中为模板类的成员函数提供定义。
这些成员函数的定义必须在实例化点对编译器可见(即,从调用这些函数的.cpp
文件中),否则只会看到它们的声明,编译器在处理不同的翻译单元时,只会依赖于在其他地方定义的函数。
由于在编译器可见其定义的翻译单元(即.cpp
文件)中没有该函数的实例化,因此不会生成任何函数,并且链接器最终会抱怨没有提供定义。
您应该将cache
的构造函数的定义放在定义类模板cache
的头文件中(在您的情况下,就是cache_controller.hpp
)。
模板化方法的实现必须与保存其声明的文件一致。模板实例化是一个编译时操作,而不是链接时。将两者合并以解决链接器错误。也就是说,在类内部或外部但在同一文件中实现构造函数。
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针