首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在执行以下代码时出错?

为什么我在执行以下代码时出错?
EN

Stack Overflow用户
提问于 2011-07-19 12:00:36
回答 4查看 359关注 0票数 2

技术1 -> 导致错误

我有三个文件MyType.hMyType.cppmain.cpp

MyType.h

代码语言:javascript
复制
#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();
};
#endif

MyType.cpp

代码语言:javascript
复制
#include"MyType.h"

void A::vSetData(T iPar1){
    if(iPar1 <= iMax)
        iData = iPar1;
}
void A::vDisplayData(){
    cout<<"\nData is: "<<iData<<endl;
}

main.cpp

代码语言:javascript
复制
#include"MyType.h"

typedef A<int,20> MyType;

int main(){
    int x = 12;
    MyType obj;
    obj.vSetData(12);
    obj.vDisplayData();
    return 0;
}

ERRORS:10错误。它们如下:-

  • mytype.cpp(2):error C2955:'A‘:使用类模板需要模板参数list
  • mytype.h(9):请参见'A'
  • mytype.cpp(2)声明: error C2955:'A’:使用类模板需要模板参数list
  • mytype.h(9):参见'A'
  • mytype.cpp(2)声明:错误C2065:'T‘:未声明的identifier
  • mytype.'iPar1'
  • mytype.cpp(2):C2761:'void::vSetData(T)‘:成员函数重声明,而不是allowed
  • mytype.cpp(2):error C2059:语法错误:')'
  • mytype.cpp(2):error C2143:语法错误:缺失;“'{'
  • mytype.cpp(2):error C2447:”{ '{‘:缺少函数头(旧式形式的list?)
  • mytype.cpp(6):error C2955:'A’:使用类模板需要模板参数list
  • mytype.h(9):请参阅'A'
  • mytype.cpp(6)声明: error C2509:'vDisplayData‘:'A'
  • mytype.h(中未声明的成员函数。9):见“A

”的声明

技术2 -> 工作良好。

AboveCodeInOneFile.cpp

代码语言:javascript
复制
#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上做了什么错误。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-19 12:11:32

每个方法定义都需要它上面的完整类名装饰:

代码语言:javascript
复制
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/头。

票数 2
EN

Stack Overflow用户

发布于 2011-07-19 12:03:59

定义模板类时,编译器必须查看方法定义。所以它们必须在头文件中。

编辑

您必须包括方法实现,所以编译器可以看到它。您可以通过将它们包含在另一个`MyType_impl.h“文件中:

代码语言:javascript
复制
template <class T, int iMax>
void A<T, iMax>::vDisplayData()
{
  cout<<"\nData is: "<<iData<<endl;
}
票数 3
EN

Stack Overflow用户

发布于 2011-07-19 12:10:57

技术1对模板来说是错误的。别用它。

将模板视为实际功能的蓝图。蓝图本身是不可编译的。只有当您替换模板参数(<class T,int iMax>)时,才会生成实际的函数。因此,编译器在尝试从模板构建函数时必须查看蓝图。为了查看蓝图,它们必须完全驻留在头文件中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6746778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档