Декларация и определение несоответствия - PullRequest
1 голос
/ 07 апреля 2020

Объявление и несоответствие определений в моем шаблонном классе (все, что не имеет значения, было вырезано):

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.");
}

Пожалуйста, помогите, потому что я не вижу никакой причины этого.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Следующее будет работать:

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

Поскольку enum class Language является частью WidgetLanguageManager шаблона класса, вам необходимо предшествовать ему с оператором области действия.

1 голос
/ 07 апреля 2020

В качестве альтернативы дополнительному typename, вы можете использовать конечный тип возврата:

template <typename LanguageMap>
auto WidgetLanguageManager<LanguageMap>::ToLanguage(const QString& language)
-> Language
{
/*..*/
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...