c++;当我将模板放入另一个类中进行实例化时,模板链接错误? 我不知道这是否有区别,但我正在使用VS C++ 6
链接c++;当我将模板放入另一个类中进行实例化时,模板链接错误? 我不知道这是否有区别,但我正在使用VS C++ 6 ,c++,visual-c++,C++,Visual C++,链接 vid3Dlg.obj : error LNK2001: unresolved external symbol "public: double __thiscall Image::jdlMin(double,double)" (?jdlMin@Image@@QAENNN@Z) Debug/vid3.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. 我也试过: template <
vid3Dlg.obj : error LNK2001: unresolved external symbol "public: double __thiscall Image::jdlMin(double,double)" (?jdlMin@Image@@QAENNN@Z)
Debug/vid3.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
我也试过:
template <class T> T Image::jdlMin( T a, T b )
template T Image::jdlMin(T a,T b)
我也犯了同样的错误
//Image.h
class Image
{
public:
Image();
virtual ~Image();
template <class T> T jdlMin( T a, T b );
}
//Image.cpp
Image::Image()
{
}
Image::~Image()
{
}
template <class T> T jdlMin( T a, T b )
//I tried this also: template <class T> T Image::jdlMin( T a, T b )
{
return ( a < b );// ? a : b;
}
//CVid3Dlg.cpp
void CVid3Dlg::exTemplate()
{
Image *im = new Image();
int s=0;
s = im->jdlMin((double)3,(double)4); //
}
//Image.h
阶级形象
{
公众:
图像();
虚拟~Image();
模板tjdlmin(ta,tb);
}
//Image.cpp
Image::Image()
{
}
图像::~Image()
{
}
模板T jdlMin(T a,T b)
//我也试过:模板T Image::jdlMin(ta,tb)
{
返回(ajdlMin((双)3,(双)4)//
}
您错过了函数定义前面的类
template <class T> T jdlMin( T a, T b )
模板tjdlmin(tA,tB)
应该是
template <class T> T Image::jdlMin( T a, T b )
template T Image::jdlMin(T a,T b)
而且,定义必须在头文件中,现在我看到您的评论,它在cpp中。没有文本的问题,不值得解释
template <class T> T Image::jdlMin( T a, T b )
{
return ( a < b );// ? a : b;
}
template T Image::jdlMin(T a,T b)
{
返回(a
这次,我编译它(在VC++10下)来测试功能:
//Image.h
template<typename T>
class Image
{
public:
Image() {};
virtual ~Image() {};
T jdlMin( T a, T b );
};
//Image.cpp
#include "Image.h"
template <typename T>
T Image<T>::jdlMin( T a, T b )
{
return ( a < b );
};
int _tmain(int argc, _TCHAR* argv[])
{
Image<double> *im = new Image<double>();
double s = 0.0;
s = im->jdlMin( 3.0 , 4.0 );
return 0;
}
//Image.h
模板
阶级形象
{
公众:
图像(){};
虚拟~Image(){};
T jdlMin(ta,tb);
};
//Image.cpp
#包括“Image.h”
模板
T Image::jdlMin(ta,tb)
{
返回(ajdlMin(3.0,4.0);
返回0;
}
希望这有助于
顺便说一下,我看了一个很好的C++文档:“T类”和“Type NeNT T”有着完全相同的意思,行为方式完全相同…p> 我相信
typename T
比class T
更受欢迎。也许我应该使用void pointersPft,绝对不是,模板更像C++,如果它们完成了任务,你需要。它的实例化问题是“im”吗?我做了人们认为是问题所在的事情,但正如我所说的,它也会产生同样的错误。为什么你告诉我答案中应该写,而必须写!?您对我的回答发表了评论:“我说的是“应该”,而不是“必须”。在您的回答中,您写道:“……定义必须在头文件中……”。Aaaaaaah:d很抱歉误解:d我这样说是因为函数的返回错误,而不是因为定义:)如果实现在定义中,这将起作用。但我需要一个“cpp”文件。这就是我列出的错误。我给了你一个有效的分数。。。我会给你其余的,如果你能让其他工作以及,正如我上面所显示的。谢谢你调查这个。。。正如我前面列出的,我使用VS C++ 6。头中的模板可以工作,除非我更改传递的数字,否则编译器不会根据代码中的更改进行更新。我已经读过6.0版本的模板有问题。所以这在VC10中有效,但不确定它是否在VC6.0中有效??无论如何,我会选择这一个。是的,VC6不是很好的模板。。。你真的用VC6吗?到目前为止,对我来说最好的编译器是VC++7.1(VC.NET2003)。非常稳定,非常快,非常小(800mb)。VC 8,9,10都是狗屎。。。速度慢、编译器问题、部署问题。。。VC7.1很酷。。。去买吧:)ebay上的15美元……模板和重载不同类型的函数一样快或慢。它们会消耗更多的内存开销吗?我强调这是一个问题,因为我可以将其应用于非常大的矩阵,比如1GB到2GB的数据??