c++;ubuntu linux.cpp中的模板 我目前在UBUTUT910-C++中工作。 我需要在方法中定义一个泛型对象。我必须在.h文件中定义方法。我怎么做?我做了以下工作:

c++;ubuntu linux.cpp中的模板 我目前在UBUTUT910-C++中工作。 我需要在方法中定义一个泛型对象。我必须在.h文件中定义方法。我怎么做?我做了以下工作:,c++,templates,C++,Templates,文件.h 使用g++test.cpp-o test libfile.a编译后,我有一个错误:未定义对bool的引用…为什么?有没有其他方法来创建泛型对象?通常的问题。看一看: 只需将所有内容放入头文件 file.hpp class ana { //code public: template <class T> bool method (T &Data) { //code } }; 通常的问题。看一看: 只需将所有内容放入头文

文件.h


使用
g++test.cpp-o test libfile.a编译后,我有一个错误:
未定义对bool的引用…
为什么?有没有其他方法来创建泛型对象?

通常的问题。看一看:

只需将所有内容放入头文件

file.hpp

class ana
{
    //code
public:
    template <class T>  bool method (T &Data)
    {
        //code
    }
};

通常的问题。看一看:

只需将所有内容放入头文件

file.hpp

class ana
{
    //code
public:
    template <class T>  bool method (T &Data)
    {
        //code
    }
};
  • 您忘记将
    file.cpp
    构建到二进制文件中
  • 无论如何,您应该将函数模板定义放在标题中
  • 您忘记将
    file.cpp
    构建到二进制文件中
  • 无论如何,您应该将函数模板定义放在标题中

  • 您需要将
    method()
    方法的定义更改为位于头文件中:

    class ana
    {
    public:
        template <class T>
        bool method (T &Data)
        {
            // Do whatever you want in here
        }
    };
    
    ana类
    {
    公众:
    模板
    布尔法(T&Data)
    {
    //在这里你想干什么就干什么
    }
    };
    

    有关详细说明,请查看以下链接-

    您需要将
    方法()的定义更改为头文件中的方法:

    class ana
    {
    public:
        template <class T>
        bool method (T &Data)
        {
            // Do whatever you want in here
        }
    };
    
    ana类
    {
    公众:
    模板
    布尔法(T&Data)
    {
    //在这里你想干什么就干什么
    }
    };
    

    查看下面的链接以获得详细的解释-

    将函数定义与声明(在头文件本身中)放在一起肯定会有帮助,而且是一种选择。但是,如果要分隔函数定义,请在
    .cpp
    文件的末尾显示以下行。它被称为
    显式实例化
    。这将处理链接器错误。我尝试了一些代码,根据您提供的内容,这似乎有效:

    文件.h:

    \ifndef\uu ANA\H__
    #定义__
    模板
    全日空{
    公众:
    布尔法(T&data);
    };
    #恩迪夫
    
    file.cpp:

    #包括
    #包括
    使用名称空间std;
    模板
    布尔安娜::方法(T和数据){
    
    cout将函数定义与声明放在一起(在头文件本身中)当然有帮助,这是一种选择方式。但是,如果您想分离函数定义,请在
    .cpp
    文件的末尾添加以下行。它被称为
    显式实例化
    。这将解决链接器错误。我尝试了一些代码,根据您给出的代码,这似乎有效:

    文件.h:

    \ifndef\uu ANA\H__
    #定义__
    模板
    全日空{
    公众:
    布尔法(T&data);
    };
    #恩迪夫
    
    file.cpp:

    #包括
    #包括
    使用名称空间std;
    模板
    布尔安娜::方法(T和数据){
    不能像这样在main.cpp中包含cpp文件:#包含“ana.cpp”,您将不会有错误。
    

    只需在main.cpp中包含cpp文件,如下所示:#包含“ana.cpp”,您将不会有错误。

    所有模板代码都必须放在标题中。@Unaperson,你应该将其作为答案而不是评论提交。@Trent事实上,我应该投票以重复的方式关闭它,但我不能因为发现无数问题中的一个是重复的而生气。所有模板代码的可能重复必须放在标题中。@Unaperson,你应该以重复的方式提交它。@Unaperson回答,不是评论。@Trent事实上,我应该投票作为一个傻瓜来结束它,但我不能因为发现无数问题中的一个是傻瓜而感到恼火。可能的副本仅仅用一个链接来回答是一个糟糕的做法。你能告诉我如何更改我的代码吗?请?:)我是斯塔克,我同意这是一个糟糕的做法。但我想如果我如果使用搜索,我会发现这是一个副本。不过,谢谢你的元链接。这对我来说是新的。在我的机器上运行良好。除了我从你那里复制的打字错误之外,它必须是低上限
    ana*ann=new ana()
    只使用链接回答是不好的做法。你能告诉我如何更改我的代码吗?请?:)我很抱歉,我同意这是不好的做法。但我想如果我使用搜索,我会发现这是重复的。不过,谢谢你的元链接。这对我来说是新的。在我的机器上运行良好。除了我复制的f告诉你它必须是低上限的
    ana*ann=new ana();
    你是什么意思?我错在哪里了?你能重写我的代码吗?我不需要构建文件.cpp,因为我构建了.afile@linuxx您可以从内联
    模板bool方法(T&Data)的实现开始
    ,在标题中。另外,它应该是
    类Ana
    ,而不是
    类Ana
    。主要的一点是模板方法必须在标题中实现。1.对于非模板函数,您提供标题和编译库,这很好。对于模板函数,编译器必须能够看到实现“在使用点的位置,所以它需要在头中,所以file.cpp是否在二进制中是无关紧要的。@大卫:我知道。#2包含#1。但是#1是他在假设函数定义在
    file.cpp
    中时犯的一个一般性错误:它被完全排除在构建之外。你是什么意思?wher?”我错了吗?你能重写我的代码吗?我不需要构建文件.cpp,因为我构建了.afile@linuxx您可以从内联
    模板bool方法(T&Data)的实现开始
    ,在标题中。另外,它应该是
    类Ana
    ,而不是
    类Ana
    。主要的一点是模板方法必须在标题中实现。1.对于非模板函数,您提供标题和编译库,这很好。对于模板函数,编译器必须能够看到实现在使用点显示,因此它需要在标头中,因此file.cpp i
    #include "file.hpp"
    main()
    {
        //code
        Ana* ann = new Ana();
    
        if (ann->method(*ann)){//code}
    }
    
    class ana
    {
    public:
        template <class T>
        bool method (T &Data)
        {
            // Do whatever you want in here
        }
    };
    
    #ifndef __ANA_H__
    #define __ANA_H__
    
    template <class T>
    class ana {
    
      public: 
        bool method(T& data);
    };
    
    #endif
    
    #include <ana.h>
    #include <iostream>
    using namespace std;
    
    template <typename T>
    bool ana<T>::method(T& data) {
      cout << "Data = " << data << endl;
      if(data > 0) {
        return true;
      }
      return false;
    }
    
    //explicit instantiation for avoidance of g++ linker errors.
    template
    bool ana<int>::method(int& data);
    
    template
    bool ana<double>::method(double& data)