Локальный класс в шаблоне класса - проблема
От: Akai  
Дата: 08.08.05 04:46
Оценка:
Здравствуйте.
Имеется шаблон класса CXList с локальным классом CXElement


template <class CDataType> class CXList
{
    class CXElement
    {
    ...
    };

    CXElement* GetElement(int iPos);
    ...
};



Какой должен быть заголовок у реализации функции GetElement ?
В книге по ANSI C++ встретил следующий вариант, самый простой:

template <class CDataType> CXElement* CXList<CDataType>::GetElement (int iPos)


В Borland C++ Builder компилятор говорит, что неизвестен класс CXElement. Работает такой вариант:

template <class CDataType> CXArray<CDataType>::CXElement* CXList<CDataType>::GetElement (int iPos)


В MSVC 7, в свою очередь, не работает ни первый, ни второй вариант.
Как описать функцию в MSVC ? Какой вариант "правильный" (соответствует стандарту) ?

Спасибо.
Re: Локальный класс в шаблоне класса - проблема
От: remark Россия http://www.1024cores.net/
Дата: 08.08.05 05:32
Оценка:
Здравствуйте, Akai, Вы писали:

A>Здравствуйте.

A>Имеется шаблон класса CXList с локальным классом CXElement


A>
A>template <class CDataType> class CXList
A>{
A>    class CXElement
A>    {
A>    ...
A>    };

A>    CXElement* GetElement(int iPos);
A>    ...
A>};
A>



A>Какой должен быть заголовок у реализации функции GetElement ?

A>В книге по ANSI C++ встретил следующий вариант, самый простой:

A>
A>template <class CDataType> CXElement* CXList<CDataType>::GetElement (int iPos)
A>


A>В Borland C++ Builder компилятор говорит, что неизвестен класс CXElement. Работает такой вариант:


A>
A>template <class CDataType> CXArray<CDataType>::CXElement* CXList<CDataType>::GetElement (int iPos)
A>


A>В MSVC 7, в свою очередь, не работает ни первый, ни второй вариант.

A>Как описать функцию в MSVC ? Какой вариант "правильный" (соответствует стандарту) ?

A>Спасибо.


Работает такой вариант:

template <class CDataType> typename CXList<CDataType>::CXElement* CXList<CDataType>::GetElement (int iPos)

1. Перед именем типа надо писать typename, т.к. компилятор не знает, что CXList<CDataType>::CXElement — это тип.
2. Перед именем CXElement надо писать CXList<CDataType>:: — т.к. класс CXList<CDataType> является пространством имён.

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Локальный класс в шаблоне класса - проблема
От: dad  
Дата: 08.08.05 05:34
Оценка:
A>Какой должен быть заголовок у реализации функции GetElement ?


template<class CDataType>
typename <CDataType>::CXElement*
CXList<CDataType>::GetElement(int)
{
 return ....;
}
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.