【问题标题】:Declaration and definition mismatch声明和定义不匹配
【发布时间】:2020-04-07 07:11:16
【问题描述】:

我的模板类中的声明和定义不匹配(所有不相关的内容都已删除):

template <typename LanguageMap>
class WidgetLanguageManager
{
    public:
        enum class Language { DE, ENG, PL };
    protected:
        Language language;
        //Some protected fields
    public:
        explicit WidgetLanguageManager(const Language& language);
        explicit WidgetLanguageManager(const QString& language);
        Language ToLanguage(const QString& language);
    protected:
        //some protected methods
};


template <typename LanguageMap>
Language WidgetLanguageManager<LanguageMap>::ToLanguage(const QString& language) // this cannot be matched with a declaration
{
    for (QChar& c: language)
    {
        c = c.toLower();
    }

    switch (language)
    {
        case "german": return Language::DE;
        case "english": return Language::ENG;
        case "polish": return Language::PL;
    }
    throw RuntimeError("Wrong language paremeter.");
}

请帮忙,因为我看不出这背后的任何原因。

【问题讨论】:

  • 对于此类问题,请始终提供错误消息。

标签: c++ templates declaration definition mismatch


【解决方案1】:

以下方法可行:

template <typename LanguageMap>
typename WidgetLanguageManager<LanguageMap>::Language WidgetLanguageManager<LanguageMap>::ToLanguage(const QString& language)
// ^^^^^ 'typename' keyword needed because 'Language' is dependent name

由于enum class LanguageWidgetLanguageManager 模板类的一部分,您需要在它前面加上范围运算符。

【讨论】:

  • 这有帮助:模板 typename WidgetLanguageManager::Language WidgetLanguageManager::ToLanguage(const QString& language)
【解决方案2】:

除了额外的typename,您可以使用尾随返回类型:

template <typename LanguageMap>
auto WidgetLanguageManager<LanguageMap>::ToLanguage(const QString& language)
-> Language
{
/*..*/
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多