Visual Studio 不会使用 *.inl 实现编译模板类

isk*_*nar 3 c++ templates compiler-errors visual-studio visual-c++

我正在关注一本关于SFML游戏开发的书,但我卡在第二章,因为我无法编译我刚刚写的代码。

它几乎是书中的逐字复制(除了成员变量名称和异常文本)。我有使用 C++ 和模板的经验,但我以前从未见过这个错误,我已经盯着这个看了几个小时,我没有发现这段代码有什么问题。

这是我的 *.h 文件:

#pragma once
#include <map>
#include <memory>
#include <string>
#include <stdexcept>
#include <cassert>
#include "enumFile.h"

template <typename Resource, typename Identifier>
class ResourceHolder
{
public:
    ResourceHolder(void);
    ~ResourceHolder(void);

    void load(Identifier id, const std::string & filename);

    template <typename Parameter>
    void load(Identifier id, const std::string & filename, 
              const Parameter& secondParam);

    Resource & get(Identifier id);
    const Resource & get(Identifier id) const;

private:
    std::map<Identifier, std::unique_ptr<Resource>> resourceMap;
};

#include "ResourceHolder.inl"
Run Code Online (Sandbox Code Playgroud)

这是我的 *.inl 文件:

template <typename Resource, typename Identifier>
void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string& filename)
{
    // Create and load resource
    std::unique_ptr<Resource> resource(new Resource());
    if (!resource->loadFromFile(filename))
        throw std::runtime_error("Failed to load resource: " + filename);

    // If loading successful, insert resource to map
    auto inserted = resourceMap.insert(std::make_pair(id, std::move(resource)));
    assert(inserted.second);
}

template <typename Resource, typename Identifier>
template <typename Parameter>
void ResourceHolder<Resource, Identifier>::load(Identifier id, const std::string& filename, 
                                                const Parameter& secondParam)
{
    // Create and load resource
    std::unique_ptr<Resource> resource(new Resource());
    if (!resource->loadFromFile(filename, secondParam))
        throw std::runtime_error("Failed to load resource: " + filename);

    // If loading successful, insert resource to map
    auto inserted = resourceMap.insert(std::make_pair(id, std::move(resource)));
    assert(inserted.second);
}

template <typename Resource, typename Identifier>
Resource& ResourceHolder<Resource, Identifier>::get(Identifier id)
{
    auto found = resourceMap.find(id);
    assert(found != resourceMap.end());

    return *found->second;
}

template <typename Resource, typename Identifier>
const Resource& ResourceHolder<Resource, Identifier>::get(Identifier id) const
{
    auto found = resourceMap.find(id);
    assert(found != resourceMap.end());

    return *found->second;
}
Run Code Online (Sandbox Code Playgroud)

抱歉有很多代码,但我在这里很绝望。我收到了不寻常的错误,都在 *.inl 文件中,我没有写它们,而是截取了屏幕截图: VS2012 错误

知道如何解决这个问题吗?

编辑:关于如何使用该类的一个词。

我在纹理命名空间中有 enum (这就是“enumFile.h”)

namespace Textures
{
    enum ID {Landscape, Airplane, Missile};
}
Run Code Online (Sandbox Code Playgroud)

当我想使用该类时,我按如下方式使用它:

ResourceHolder<sf::Texture, Textures::ID> textureHolder;
textureHolder.load(Textures::Airplane, "path/to/texture.png");
Run Code Online (Sandbox Code Playgroud)

小智 5

从 VS 中的项目中删除或排除 ResourceHolder.inl 文件,然后再次添加它为我解决了这个问题。我不知道为什么这行得通,但现在它编译得很好。