0

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

这是代码:

缓存控制器.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);

缓存控制器.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))' 

当然,如果有任何更简单的方法来实现具有任意键、值和创建函数的对象缓存,我全都听好了。

4

2 回答 2

3

.cpp您在文件中为模板类的成员函数提供定义。

这些成员函数的定义必须在实例化点对编译器可见(即,从.cpp调用这些函数的文件中),否则只会看到它们的声明,并且编译器将仅依赖于在其他地方定义的该函数,在处理不同的翻译单元时。

由于.cpp在编译器可见其定义的翻译单元(即文件)中没有该函数的实例化,因此不会生成任何函数,并且链接器最终会抱怨没有提供定义。

您应该将cache' 构造函数的定义放在定义类模板的头文件中cache(在您的情况下是cache_controller.hpp)。

于 2013-02-09T14:00:36.270 回答
2

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

于 2013-02-09T14:00:22.443 回答