gpt4 book ai didi

c++ - 带有 MinGW 4.8 的 Windows 上的模板 undefined reference

转载 作者:行者123 更新时间:2023-11-28 02:37:37 24 4
gpt4 key购买 nike

我在类中使用静态模板成员;模板在软件内置的 cpp 中实例化。我有一个在 header 中使用 name() 模板方法的软件插件,但不构建包含实例化的源文件。该构建适用于带有 g++-4.9 的 Linux,但在 MinGW 4.8 上失败。我想知道如何让它与 几乎 相同的编译器一起工作,但在 Windows 上。

.hpp :

enum class ToplevelMenuElement
{
FileMenu,
...
AboutMenu
};

enum class FileMenuElement
{
New,
... ,
Quit
};

// Others menus macros are defined

class MenuInterface
{
public:
template<typename MenuType>
static QString name(MenuType elt);

private:
static const std::map<ToplevelMenuElement, QString> m_map;
static const std::map<FileMenuElement, QString> m_fileMap;
};

.cpp :

template<>
QString MenuInterface::name(ToplevelMenuElement elt)
{
return m_map.at(elt);
}

template<>
QString MenuInterface::name(FileMenuElement elt)
{
return m_fileMap.at(elt);
}

const std::map<ToplevelMenuElement, QString> MenuInterface::m_map
{
{ToplevelMenuElement::FileMenu, QObject::tr("File")},
...
{ToplevelMenuElement::AboutMenu, QObject::tr("About")}
};

const std::map<FileMenuElement, QString> MenuInterface::m_fileMap
{
{FileMenuElement::New, QObject::tr("New")},
...,
{FileMenuElement::Quit, QObject::tr("Quit")}
};

错误:

undefined reference to `QString MenuInterface::name<ToplevelMenuElement>(ToplevelMenuElement)'

是否有任何标志可用于进行某种惰性实例化?或者我应该在我的插件中构建包含模板实例化的 .cpp 吗?

最佳答案

因为您正在链接一个包含显式特化的源文件,所以您需要在定义它们之前声明您的显式特化。来自 §14.7.3/3:

A declaration of a function template, class template, or variable template being explicitly specialized shall precede the declaration of the explicit specialization. [ Note: A declaration, but not a definition of the template is required. — end note ]

所以你需要在你的课后把这些放在你的头文件中:

template<>
QString MenuInterface::name(ToplevelMenuElement elt);

template<>
QString MenuInterface::name(FileMenuElement elt);

关于c++ - 带有 MinGW 4.8 的 Windows 上的模板 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26979392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com