变分参数模板方法专门化



我正在资产管理器实现中实现loadAsset方法。我尝试过使用以下签名的可变参数模板方法:

class AssetManager {
public:
template <typename AssetType, typename... Args>
void loadAsset(std::string_view name, const Args &...args);
...
};

.cpp文件中的以下专业化:

template <>
void AssetManager::loadAsset<Texture, std::string>(std::string_view name, const std::string &path) {...}
template void AssetManager::loadAsset<Texture, std::string>(std::string_view, const std::string &path); //explicit instantiation

然而,当尝试调用loadAsset方法时,如:

m_assetManager->loadAsset<NOX::Texture>("texture", "assets/textures/texture.jpg");

我得到以下错误:

error LNK2019: unresolved external symbol "public: void __cdecl NOX::AssetManager::loadAsset<class NOX::Texture,char [28]>(class std::basic_string_view<char,struct std::char_traits<char> >,char const (&)[28])" (??$loadAsset@VTexture@NOX@@$$BY0BM@D@AssetManager@NOX@@QEAAXV?$basic_string_view@DU?$char_traits@D@std@@@std@@AEAY0BM@$$CBD@Z) referenced in function "public: __cdecl ExampleApplication::ExampleApplication(struct NOX::ApplicationSpecification const &)" (??0ExampleApplication@@QEAA@AEBUApplicationSpecification@NOX@@@Z)

我该如何防止这种情况发生?我正在使用C++17,不能使用C++20。

如果您在cpp文件中专门化一个模板,它将在给定文件中可用,但不能在外部使用(当然,除非您手动实例化它(。最好的方法是将所有模板定义移动到页眉。

相关内容

  • 没有找到相关文章

最新更新