我正在资产管理器实现中实现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文件中专门化一个模板,它将在给定文件中可用,但不能在外部使用(当然,除非您手动实例化它(。最好的方法是将所有模板定义移动到页眉。