1

我是 C++ 的初学者,所以如果我下面的错误被证明是愚蠢的,请原谅我。尽管如此,我仍然坚持我的代码,并希望得到任何帮助。

尝试通过 g++ 编译时出现以下错误:

In file included from A.cpp:2:
List.h:20: error: ‘List’ is not a template type
A.cpp: In member function ‘void A::NowyObiekt(int)’:
A.cpp:6: error: ‘list_a’ was not declared in this scope
make: *** [A.o] Error 1

我的代码分为以下文件:

  • 啊: http: //pastebin.com/QQ04xx2j(标题)
  • A.cpp:下面

    #include "A.h"
    #include "List.h"
    
    void A::NewObject(int i)
    {
            list_a.Add(i);
    }
    
    int A::Compare(int a, int b)
    {
            if ( a>b ) return 1;
            if ( a<b ) return -1;
            else return 0;
    }
    
  • List.h:下面(标题)

    #ifndef LIST_H
    #define LIST_H
    template<typename T>
    class Node
    {
        Node()
        {
            nxt = pre = 0;
        }
        Node(const T& el, Node *n = 0, Node *p = 0 )
        {
            dana = el; nxt = n; pre = p;
        }
        T dana;
        Node *nxt, *pre;
    };
    
    template<typename T>
    class List
    {
    public:
        List()
        {
            head = tail = 0;
        }
        void Add(const T&);
    protected:
        Node<T> *head,*tail;
    };
    
    #endif
    
  • List.cpp:http ://pastebin.com/a3HQ9yZ4

  • prog.cpp:下面(主要)

    #include "List.h"
    #include "A.h"
    
    int main()
    {
        int i = 5;
        class List list_a;
        class A obj;
    
        obj.Add(i);
    }
    
  • 并且生成文件是: http: //pastebin.com/GTR5jW54

如前所述,我仍然是初学者,所以请理解。我会感谢任何帮助和明确的解释。提前致谢。

4

1 回答 1

4

您的代码有几个问题:第一个是您没有在任何list_a地方声明任何命名的变量。这个错误应该很明显。另一种是您使用List该类而不给它模板参数。

最后一点关于您的问题:由于您的文件确实非常小,您可以将它们放在问题中而不是链接到它们。

编辑:关于List 模板问题。

您已经Node在 中正确使用List,即将节点声明为Node<T>. 当您使用时,List您只需要做同样的事情。例如,要声明一个整数列表:

List<int> my_int_list;

List此外,由于您只使用类中的公共函数,A因此不需要friend声明。如果您确实需要使用受保护或私有成员(IMO 是不良设计的标志),您还需要将该朋友声明模板化:

friend class List<sometype>;

最后,您的代码无论如何都不会编译...原因是当您使用模板类时,必须完全定义整个类(即完成其函数实现)。您可以通过将函数放在头文件中来解决此问题。在定义函数时,您还需要那里的模板参数:

template<typename T>
void List<T>::Add(const T& el)
{
    Node<T>* head = new Node<T>(el);
    if ( Compare(el,i) > i )
        std::cout << "Ok" << std::endl;
}

请注意,我在几个地方添加了模板参数。

于 2012-04-19T05:18:05.377 回答