【问题标题】:C++ Error: class template has already been definedC++ 错误:类模板已被定义
【发布时间】:2013-01-27 05:41:02
【问题描述】:

我在 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 中的所有内容似乎都与我已经拥有的模板位有关。

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

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

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

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

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

    然后在 cpp 文件中,你会有类似的内容:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      修复 -

      从您的标题中删除。

      你的 .cpp 应该是这样的。

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

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

      另外我想知道你是否知道the problems involving defining the template classes members in a .cpp file

      【讨论】:

      • 好的...但是当我注释掉结构位时,我在 'Node(T D )'。
      • @SírJeffMeadows 正如我在回答中给出的那样,仅仅评论是不够的。请阅读我添加到末尾的链接。您可能希望将函数的定义从 .cpp 移动到 .h,以避免该问题。
      • 好的,我明白你的意思了。那确实有帮助。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2012-10-04
      相关资源
      最近更新 更多