9

I'm currently trying to implement a sort algorithm in a list template class using node structures private to the list class. I'm using a few private recursive functions which return a pointer to a node type which causes g++ to give me a declaration error. Here's a sample of what I have -

template<class T>
class SList
{
private:
    struct NODE
    {
        T* elem;
        NODE* next;
    } *_head, *_tail;

NODE* sort(NODE* node);

public:
    //other declarations...

}

template<class T>
NODE* SList<T>::sort(NODE* node) //Error: 'NODE' does not name a type
{
    //sorting algorithm
}

Is this a limitation of c++ or am I missing something?

Lindenk
  • 458
  • 2
  • 6
  • 14

3 Answers3

16

Since Node is an internal class you need to tell the compiler where Node's definition comes from.

Furthermore, Node's definition changes depending on what SList's template parameter is (it is a dependent type)

So you have to explicitly refer to Node as such:

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node) 
{
    //sorting algorithm
}
  • Note the typename because Node is a dependent type (it depends on the type of SList)
  • Note the SList<T>::Node because Node is a type dependent on SList's type.
Steve Lorimer
  • 27,059
  • 17
  • 118
  • 213
  • Can it be achieved by "decltype" now? – daohu527 Feb 25 '21 at 00:56
  • @dahohu527 I'm not sure I understand the question. Can what be achieved? That said, no, I don't think decltype helps in this instance - but if you could clarify I may be able to better answer your question – Steve Lorimer Feb 25 '21 at 07:57
3

Below works fine:

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node)
^^^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^^^^^^^^^^

Is this a limitation of c++

No. Because there can be any structure/type named NODE outside the scope of SList<>; so actually it's a facility which C++ provides you where you can have same name types in different scope.

"Why I need keyword typename" can be found here.

Community
  • 1
  • 1
iammilind
  • 68,093
  • 33
  • 169
  • 336
1

The type you want to refer to is within SList, thus you must refer to it as such:

template<class T>
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node);
Agentlien
  • 4,996
  • 1
  • 16
  • 27