1

我在 Visual Studio 2010 Pro 中收到此错误:“错误 C2953:'list_1::Node':已定义类模板”

这是我收到错误的 Node.cpp 类列表(在第 24 行,代码的最后一行。)

#include "Node.h"

namespace list_1
{
    template <typename T>
    struct Node
    {
        //Constructor
        Node<T>(T D)
        {
            data = d;
            next = NULL;        
        }
    }
;}

和 Node.H 文件:

#pragma once

namespace list_1
{
    template <typename T>
    struct Node
    {
        T data;
        Node<T> *next;

        // Constructor
        // Postcondition: 
        Node<T> (T d);
    };
}

我已经看过here,这对我没有帮助,因为我已经使用过#pragma 一次,并且在列表头文件中我有#ifndef LIST_H 和#define LIST_H。这个问题不适合我的需要,这个答案中的所有内容似乎都与我已经拥有的模板位有关。

如果我尝试将其设为 struct Node,则会收到错误“错误 C2753:'list_1::Node':部分专业化无法匹配主模板的参数列表”

所以我不知道该怎么办。请帮忙。

4

2 回答 2

2

对于一个普通的(非模板)类,你会做这样的事情:

//whatever.h
namespace Y 
    class X {
    public:
        X();
    };
}

然后在 cpp 文件中,您将拥有如下内容:

namespace Y { 
    X::X() { /* ... */ }
}

但是,对于模板,您通常需要将实现放在编译器可以看到它的任何地方,这通常意味着也放入头文件中。既然如此,很多人只是将定义写为类定义中的内联定义:

namespace Y { 
    template <class T>
    class X {
    public:
        X(T d) { /* ... */ }
    };
}

如果需要,您可以在类定义之外定义函数,但是由于它们无论如何都会成为标题,因此并不能真正完成很多事情(至少在典型情况下)。

于 2013-01-27T05:47:25.387 回答
1

我同意你的编译器。你定义了struct两次。

修理 -

从您的标题中删除。

你的 .cpp 应该是这样的。

#include "Node.h"

namespace list_1
{
    //Constructor
    template<typename T>
    Node<T>::Node(T D){
        ...
    }
}

本质上,结构块只出现在标题中。

此外,我想知道您是否知道涉及在文件中定义模板类成员的问题.cpp

于 2013-01-27T05:41:55.660 回答