C ++错误:已经定义了类模板

时间:2013-01-27 05:41:03

标签: c++ templates

我在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。此question不符合我的需求,此answer中的所有内容似乎都与我已有的模板位相关。

如果我尝试使它结构化Node我得到错误“错误C2753:'list_1 :: Node':部分特化无法匹配主模板的参数列表”

所以我不知所措。请帮忙。

2 个答案:

答案 0 :(得分: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) { /* ... */ }
    };
}

如果需要,您可以在类定义之外定义函数,但是因为它们无论如何都会成为标题,但实际上并没有真正完成(至少在典型情况下)。

答案 1 :(得分:1)

我同意您的编译器..您正在定义struct两次。

要修复 -

从标题中删除。

你的.cpp应该是这样的。

#include "Node.h"

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

基本上,struct块只出现在标题中。

此外,我想知道您是否了解the problems involving defining the template classes members in a .cpp file