【问题标题】:method already defined (template class)方法已定义(模板类)
【发布时间】:2017-01-04 16:07:56
【问题描述】:

我的所有方法都收到错误“class.obj 中已定义的方法”, 我已经看到一些解决方案包括将类分离为头文件和 .cpp 文件,但在这种情况下是不可能的。

任何帮助将不胜感激。

这是我的 h 文件:http://pastebin.com/k46JEQBH

cpp 有:

#include "stdafx.h"
#include "poly.h"

【问题讨论】:

    标签: c++ templates object linker-errors


    【解决方案1】:

    问题是您的定义在您的标题中,并且它可能包含在多个 .cpp 文件中。每个 .cpp 文件都是一个新的翻译单元。想象一下,您一次编译每个 .cpp 文件。对于包含您的标头的每个 .cpp 文件,这将是第一次遇到该标头,POLY_H 尚未定义。声明允许出现多次,但定义不允许出现。将您的定义移至单独的 .cpp 文件,一切正常。

    编辑:将定义保留在标题中是必要的,并且允许模板类使用,但您的类不是模板化的。

    【讨论】:

      【解决方案2】:

      这可能是您对#pragma 的一次使用吗?你用的是什么编译器?

      您是否尝试过使用包含保护来查看是否可以解决错误?例如:

      #ifndef POLY_H
      #define POLY_H
      //your code minus the pragma once
      #endif //POLY_H
      

      【讨论】:

      • 我正在使用 Visual Studio 2015。我尝试了您的示例,但无济于事。
      • 环顾四周,this 似乎可以帮助您。在本地测试您的问题,使所有内容(包括构造函数)内联后,它构建成功。
      • 虽然我很好奇,为什么不能把代码分离成一个hpp/cpp文件呢?
      • 我不能将所有内容都声明为内联,因为它会损害代码的质量。我也无法将其作为模板类分离到 cpp 文件中
      • 那你能完全取消cpp文件吗?还是按照声明的方式制作一个h文件和一个tpp文件,并在h文件末尾包含tpp文件?
      猜你喜欢
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多