技术1 -> 导致错误
我有三个文件MyType.h,MyType.cpp和main.cpp
MyType.h
#ifndef MYTYPE_H
#define MYTYPE_H
#include<iostream>
using namespace std;
template <class T,int iMax>
class A{
T iData;
public:
void vSetData(T iPar1);
void vDisplayData();
};
#endifMyType.cpp
#include"MyType.h"
void A::vSetData(T iPar1){
if(iPar1 <= iMax)
iData = iPar1;
}
void A::vDisplayData(){
cout<<"\nData is: "<<iData<<endl;
}main.cpp
#include"MyType.h"
typedef A<int,20> MyType;
int main(){
int x = 12;
MyType obj;
obj.vSetData(12);
obj.vDisplayData();
return 0;
}ERRORS:10错误。它们如下:-
”的声明
技术2 -> 工作良好。
AboveCodeInOneFile.cpp
#include<iostream>
using namespace std;
template <class T,int iMax>
class A{
T iData;
public:
void vSetData(T iPar1){
if(iPar1 <= iMax)
iData = iPar1;
}
void vDisplayData(){
cout<<"\nData is: "<<iData<<endl;
}
};
typedef A<int,20> MyType;
int main(){
int x = 12;
MyType obj;
obj.vSetData(12);
obj.vDisplayData();
return 0;
}请告诉我我在技术1上做了什么错误。
发布于 2011-07-19 12:11:32
每个方法定义都需要它上面的完整类名装饰:
template <typename T>
void A<T>::vSetData(T iPar1){
if(iPar1 <= iMax)
iData = iPar1;
}
template <typename T>
void A<T>::vDisplayData(){
cout<<"\nData is: "<<iData<<endl;
}然而,当您这样做时,您将得到其他编译错误,原因是Abhineet概述的。要解决这个问题,您可以将我写入的定义放在类声明下面的头文件中,或者将其放在另一个标头(MyType_Inc.h)中,并在类声明头中包含/that/头。
发布于 2011-07-19 12:03:59
定义模板类时,编译器必须查看方法定义。所以它们必须在头文件中。
编辑
您必须包括方法实现,所以编译器可以看到它。您可以通过将它们包含在另一个`MyType_impl.h“文件中:
template <class T, int iMax>
void A<T, iMax>::vDisplayData()
{
cout<<"\nData is: "<<iData<<endl;
}发布于 2011-07-19 12:10:57
技术1对模板来说是错误的。别用它。
将模板视为实际功能的蓝图。蓝图本身是不可编译的。只有当您替换模板参数(<class T,int iMax>)时,才会生成实际的函数。因此,编译器在尝试从模板构建函数时必须查看蓝图。为了查看蓝图,它们必须完全驻留在头文件中。
https://stackoverflow.com/questions/6746778
复制相似问题