Список подклассов STL <T>:: ссылка Ошибка компиляции - PullRequest
1 голос
/ 02 марта 2012

Я конвертирую проект из Visual Studio 6 в Visual Studio 2010. В проекте активно используется STL.Существует специальный класс, который содержит список подклассов, чтобы добавить к нему больше методов.Вот код и ошибка компилятора, которую я получаю.

    #include <list> 
    namespace mySpace 
    { 
    template <class T> 
    class MyList : public std::list<T> 
    { 
        ...
    };

    template <class T>
    MyList<T>::reference MyList<T>::find(const_reference p_constreferenceItem) const
    {
     return std::find(this->begin(), this->end(), p_constreferenceItem);
    }
   } // namespace mySpace

Ошибка:

Error   2   error C2143: syntax error : missing ';' before 'MySpace::MyList<T>::find'   c:\myproject\mylist.h   300 1
Error   3   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\myproject\mylist.h   300 1   
Error   4   error C2888: 'MyList<T>::reference reference' : symbol cannot be defined within namespace 'MySpace' c:\myproject\mylist.h   300 1

Есть идеи, что вызывает эту ошибку?

1 Ответ

2 голосов
/ 02 марта 2012

Кажется, что вы просто пропускаете typename перед MyList<T>::reference, поскольку это зависимый тип (тот, который зависит от типа T), и компилятор не знает, что MyList<T>::referenceявляется типом и по умолчанию предполагает, что это имя переменной:

template <class T>
typename MyList<T>::reference MyList<T>::find(
                              const_reference p_constreferenceItem) const

Это не нужно для const_reference, поскольку компилятор находится в области действия MyList<T>, как только онвидел :: (имя метода) и теперь знает, что const_reference называет тип.Точно так же вам не нужно использовать typename, когда вы уже находитесь в области действия MyList<T>, например, при объявлении или определении inline-метода внутри определения класса.

I 'Я не уверен, почему VC6 позволил это, хотя.Но мы все знаем, что VC6 и шаблоны - не такие уж большие друзья, не говоря уже о свободной спецификации шаблонов C ++ и их поведении в то время.немного неформально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...