Правильный синтаксис для отдельного определения шаблонных методов вложенных классов - PullRequest
0 голосов
/ 24 октября 2018

Я пишу класс, который требует дополнительного вложенного класса внутри, помимо того, чтобы быть шаблоном, чтобы разрешить различные числовые типы:

template<typename _type>
class myClass{
    // ...
    class myNestedClass{
        myNestedClass(int v1, int v2);
        myNestedClass& operator= (std::vector<int> _vals);
        operator std::vector<_type>() const;
        // ...
    }
    // ...
    template <typename _input_type> operator*= (_input_type _val);
    // ...
}

У меня есть большая часть синтаксиса, особенно какчтобы определить методы после определения класса:

template <typename _type> 
template <typename _input_type>
myClass<_type>& myClass<_type>::operator*=(_input_type _val){ /* */ };

, но я не могу следовать той же схеме для вложенных методов класса:

template <typename _type> 
myClass<_type>::myNestedClass::myNestedClass(int v1, int v2) { /* */ };

template <typename _type> 
myClass<_type>::myNestedClass& 
template <typename _type> myClass<_type>::myNestedClass::operator= (std::vector<int> _vals) { /* */ }

template <typename _type> 
myClass<_type>::myNestedClass::operator std::vector<_type> () const { /**/ };

Но компилятор жалуется напоследние два определения метода, с error: need 'typename' before 'myClass<_type>::myNestedClass' because 'myClass<_type>' is a dependent scope

Так что именно я здесь пишу неправильно?

1 Ответ

0 голосов
/ 24 октября 2018

См. Когда необходимо ключевое слово "typename"? .

В любом случае, вы были очень близки.После исправления (плюс несколько опечаток вокруг):

template<typename _type>
class myClass{
    // ...
    class myNestedClass{
        myNestedClass(int v1, int v2);
        myNestedClass& operator= (std::vector<int> _vals);
        operator std::vector<_type>() const;
        // ...
    };
    // ...
    template <typename _input_type> myClass<_type>& operator*= (_input_type _val);
    // ...
};

template <typename _type> 
template <typename _input_type>
myClass<_type>& myClass<_type>::operator*=(_input_type _val){ /* */ }

template <typename _type>
myClass<_type>::myNestedClass::myNestedClass(int v1, int v2) { /* */ }

template <typename _type> 
typename myClass<_type>::myNestedClass& myClass<_type>::myNestedClass::operator= (std::vector<int> _vals) { /* */ }

template <typename _type> 
myClass<_type>::myNestedClass::operator std::vector<_type> () const { /**/ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...