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的数据??