C++类构造函数中的函数指针

Function pointers in C++ class constructor

本文关键字:函数 指针 构造函数 C++      更新时间:2023-10-16

我有一个模板化的类,它有一个接受单个参数的构造函数;指向采用第二模板类型的参数的函数的函数指针。并返回第一模板类型的元素。

这是代码:

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)。

模板化方法的实现必须与保存其声明的文件一致。模板实例化是一个编译时操作,而不是链接时。将两者合并以解决链接器错误。也就是说,在类内部或外部但在同一文件中实现构造函数。