+ -
当前位置:首页 → 问答吧 → 求教:如何在头文件(header file)中进行模板函数(template function)的重载?程序如下,求大神

求教:如何在头文件(header file)中进行模板函数(template function)的重载?程序如下,求大神

时间:2011-12-17

来源:互联网

程序的目的是根据输入的数输出Pentagonal数列。
pn_ls.cpp用来计算数列的函数;
is_size_ok.cpp用来判断输入的数是否合适(( <0 || >max_size ) 为不合格);
display函数由于需要应用模板(template),在头文件ex2_3中声明;
但在头文件中又无法重载(overlaod),故程序报错如下:
is_size_ok.cpp(12) : error C2780: “void display(const std::string &,const std::vector<elemType> &,int)”: 应输入 3 个参数,却提供了 2 个

我新手。。。求大神。。。

pn_ls.cpp
C/C++ code
#include"ex2_3.h"
using namespace std;

const vector<int>* pn_ls(int size)
{ 
  static vector<int> elems;    //采用局部static变量
  const int max_size = 30;
  
  if (!is_size_ok(size,max_size))
      return 0;
      
  for (int ix=elems.size();ix<size;++ix)
        elems.push_back (ix*(3*ix-1)/2);
  return &elems;
}


is_size_ok.cpp
C/C++ code
#include"ex2_3.h"
using namespace std;

bool is_size_ok(int size, const int max_size)
{
    const string msg("不支持输入的vec大小:");
    if (size<=0||size>max_size)
    {display(msg,size);
        return false;
    }    
    return true;        
}


头文件ex2_3.h
C/C++ code
#include<iostream>
#include<vector>
#include<string>

using namespace std;
//bool is_size_ok(int,const int);

//const vector<int>* pn_ls(int);

template <typename elemType>        //此函数如何声明???
void display(const string &msg, const vector<elemType> &vec, int num)
{
    cout << msg;
    for (int ix=0;ix<num;ix++)
         cout << vec[ix] << ' ';
    cout << endl;
}

//void display(const string &msg, int size)    //Overloaded Fn
//{
//    cerr << msg << size << "不合适"<<endl;
//}

bool is_size_ok(int, const int);
const vector<int>* pn_ls(int);


main.cpp
C/C++ code
#include"ex2_3.h"
using namespace std;

int main()
{  while(1){
    const vector<int>* vc;
    int num;
    cout << "查看Pentagonal数列中的几个数?请输入:";
     cin >> num;
    vc=pn_ls(num);    
    if (!vc)
        continue;
    //{system("pause");return 0;}
    display("vec为:",(*vc),num);
}
    system("pause");
    return 0;
}


作者: coastwere   发布时间: 2011-12-17

你的
void display(const string &msg, const vector<elemType> &vec, int num)
要求有3个参数,调用时
display(msg,size);
只有两个,中间少了个vector 参数

作者: keiy   发布时间: 2011-12-17

这个我知道 但不是这个问题 我想要在头文件中重载display这个函数 你看头文件里的被注释的那个dispaly函数

作者: coastwere   发布时间: 2011-12-17

但是头文件里又不能重载,模板函数又必须放在头文件里定义
引用 1 楼 keiy 的回复:

你的
void display(const string &amp;msg, const vector<elemType> &amp;vec, int num)
要求有3个参数,调用时
display(msg,size);
只有两个,中间少了个vector 参数

作者: coastwere   发布时间: 2011-12-17

去掉ex2_3.h中的注释,让头文件变成如下时:
C/C++ code
#include<iostream>
#include<vector>
#include<string>
using namespace std;

template <typename elemType>        //此函数如何声明???
void display(const string &msg, const vector<elemType> &vec, int num)
{
    cout << msg;
    for (int ix=0;ix<num;ix++)
         cout << vec[ix] << ' ';
    cout << endl;
}

void display(const string &msg, int size)    //此处去掉了注释
                                             //Overloaded Fn
{
    cerr << msg << size << "不合适"<<endl;
}

bool is_size_ok(int, const int);
const vector<int>* pn_ls(int);


输出错误为:
is_size_ok.obj : error LNK2005: "void __cdecl display(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (?display@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) 已经在 pn_ls.obj 中定义
1>main.obj : error LNK2005: "void __cdecl display(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (?display@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) 已经在 pn_ls.obj 中定义
1>Ex2.3.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

作者: coastwere   发布时间: 2011-12-17

楼主把注释掉的那个函数也用模板声明试试,虽然用不上那个模板

作者: Johnkey_Chen   发布时间: 2011-12-17

注释掉的重载函数启用,也用模板声明,如下:
ex2_3.h
C/C++ code
template <typename elemType>        //此函数如何声明???
void display(const string &msg, const vector<elemType> &vec, int num)
{
    cout << msg;
    for (int ix=0;ix<num;ix++)
         cout << vec[ix] << ' ';
    cout << endl;
}

template <typename elemType> 
void display(const string &msg, int size)    //Overloaded Fn
{
    cerr << msg << size << "不合适"<<endl;
}


报错为:
is_size_ok.cpp(12) : error C2783: “void display(const std::string &,int)”: 无法为“elemType”推导 模板 参数
1>ex2_3.h(17) : 参见“display”的声明
1>is_size_ok.cpp(12) : error C2780: “void display(const std::string &,const std::vector<elemType> &,int)”: 应输入 3 个参数,却提供了 2 个
1>ex2_3.h(8) : 参见“display”的声明

引用 5 楼 johnkey_chen 的回复:

楼主把注释掉的那个函数也用模板声明试试,虽然用不上那个模板

作者: coastwere   发布时间: 2011-12-17

你的问题是.h文件被多次包含,函数被重定义
最简的做法,把上面的程序放在一个文件中就OK了

作者: keiy   发布时间: 2011-12-17

虽然有其它解决方案,最不用动脑的方法如下:
C/C++ code

#include<iostream>
#include<vector>
#include<string>

using namespace std;

template <typename elemType>        //此函数如何声明???
void display(const string &msg, const vector<elemType> &vec, int num)
{
    cout << msg;
    for (int ix=0;ix<num;ix++)
         cout << vec[ix] << ' ';
    cout << endl;
}

void display(const string &msg, int size)    //Overloaded Fn
{
    cerr << msg << size << "不合适"<<endl;
}


bool is_size_ok(int size, const int max_size)
{
    const string msg("不支持输入的vec大小:");
    if (size<=0||size>max_size)
    {display(msg,size);
        return false;
    }    
    return true;        
}


const vector<int>* pn_ls(int size)
{ 
  static vector<int> elems;    //采用局部static变量
  const int max_size = 30;
  
  if (!is_size_ok(size,max_size))
      return 0;
      
  for (int ix=elems.size();ix<size;++ix)
        elems.push_back (ix*(3*ix-1)/2);
  return &elems;
}



//bool is_size_ok(int,const int);

//const vector<int>* pn_ls(int);


bool is_size_ok(int, const int);
const vector<int>* pn_ls(int);
int main()
{  while(1){
    const vector<int>* vc;
    int num;
    cout << "查看Pentagonal数列中的几个数?请输入:";
     cin >> num;
    vc=pn_ls(num);    
    if (!vc)
        continue;
    //{system("pause");return 0;}
    display("vec为:",(*vc),num);
}
    system("pause");
    return 0;
}


作者: keiy   发布时间: 2011-12-17

在头文件开头加上
#ifndef ex2_3_h
#define ex2_3_h

头文件最后加上
#end if

看行不行

作者: Johnkey_Chen   发布时间: 2011-12-17

。。。。。。。
这个我也会。。。

引用 8 楼 keiy 的回复:

虽然有其它解决方案,最不用动脑的方法如下:
C/C++ code

#include<iostream>
#include<vector>
#include<string>

using namespace std;

template <typename elemType> //此函数如何声明???
void display(const string &amp;msg, co……

作者: coastwere   发布时间: 2011-12-17

上面多打了个空格 是#endif

作者: Johnkey_Chen   发布时间: 2011-12-17

我只是想弄清楚怎么在头文件里定义重载模板函数,看样子不太好弄

引用 7 楼 keiy 的回复:

你的问题是.h文件被多次包含,函数被重定义
最简的做法,把上面的程序放在一个文件中就OK了

作者: coastwere   发布时间: 2011-12-17

与6楼报错相同

引用 9 楼 johnkey_chen 的回复:

在头文件开头加上
#ifndef ex2_3_h
#define ex2_3_h

头文件最后加上
#end if

看行不行

作者: coastwere   发布时间: 2011-12-17

另一方案是将
void display(const string &msg, int size) //Overloaded Fn
{
  cerr << msg << size << "不合适"<<endl;
}

写在
is_size_ok.cpp中(加在其它CPP中也可以,但要按下面的方法)
如果还有其它文件要调用这个 display,可在ex2_3.h中加
extern void display(const string &msg, int size) ;

作者: keiy   发布时间: 2011-12-17