Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Не-inline определение шаблонной функции


Автор: Axxent 23.9.2006, 18:52
Проблема возникла вроде бы достаточно тупая, но однако ж нигде ничего пока не нашел. Вот код:
Код

template <typename TYPE> class MyList
{
        template <typename TYPE> class Node
        {
        .......
        };
        .......
        Node<TYPE>* someMethod( TYPE& val )
        {
            .........
        }
};

Задача: вынести определение функции наружу, т.к. функция достаточно объемная и в виде inline как-то не смотрится. Пробовал так:
Код

template <typename TYPE> class MyList
{
        template <typename TYPE> class Node
        {
        .......
        };
        .......
        Node<TYPE>* someMethod( TYPE& val );
};

template <typename TYPE> MyList<TYPE>::Node<TYPE>* MyList<TYPE>::someMethod( TYPE& val )
{
     .........
}

Однако компилер сильно ругаецо - что-то про неуместное переопределение MyList<TYPE>::Node<TYPE>. Где я туплю? 

PS Если баян - будьте добры, поделитесь ссылкой, ей-богу искал, но не нашел.

Автор: MAKCim 23.9.2006, 19:21
Во-первых шаблонный параметр TYPE в Node недопустим (shadow-параметр)
так что делай
либо так
Код

template <typename TYPE> class MyList
{
public:
        template <typename CLASS> class Node
        {
        .......
        };
        .......
        Node<TYPE> someMethod(TYPE&);
};

template<class TYPE> MyList<TYPE>::Node<TYPE> MyList<TYPE>::someMethod(TYPE& val)
{
}

или так
Код

template <typename TYPE> class MyList
{
public:
        class Node
        {
        .......
        };

        Node someMethod(TYPE&);
};

template<class TYPE> MyList<TYPE>::Node MyList<TYPE>::someMethod(TYPE& val)
{
}

Автор: Axxent 23.9.2006, 19:22
Спасибо большое, я уже сам нашел решение в виде второго варианта и хотел было снять вопрос в силу его тупости ))

Edit:
Впрочем решение получилось немного отличное - передавать на выход требовалось указатель:

Код

template <typename TYPE> class MyList
{
public:
        class Node
        {
        .......
        };

        Node* someMethod(TYPE&);
};

template <typename TYPE> typename MyList<TYPE>::Node* MyList<TYPE>::someMethod(TYPE& val)
{
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)