c++;ubuntu linux.cpp中的模板 我目前在UBUTUT910-C++中工作。 我需要在方法中定义一个泛型对象。我必须在.h文件中定义方法。我怎么做?我做了以下工作:
文件.hc++;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 } }; 通常的问题。看一看: 只需将所有内容放入头文
使用
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)