求教:如何在头文件(header file)中进行模板函数(template function)的重载?程序如下,求大神
时间:2011-12-17
来源:互联网
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
作者: coastwere 发布时间: 2011-12-17
你的
void display(const string &msg, const vector<elemType> &vec, int num)
要求有3个参数,调用时
display(msg,size);
只有两个,中间少了个vector 参数
作者: coastwere 发布时间: 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, 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”的声明
楼主把注释掉的那个函数也用模板声明试试,虽然用不上那个模板
作者: coastwere 发布时间: 2011-12-17
最简的做法,把上面的程序放在一个文件中就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
这个我也会。。。
虽然有其它解决方案,最不用动脑的方法如下:
C/C++ code
#include<iostream>
#include<vector>
#include<string>
using namespace std;
template <typename elemType> //此函数如何声明???
void display(const string &msg, co……
作者: coastwere 发布时间: 2011-12-17
作者: Johnkey_Chen 发布时间: 2011-12-17
你的问题是.h文件被多次包含,函数被重定义
最简的做法,把上面的程序放在一个文件中就OK了
作者: coastwere 发布时间: 2011-12-17
在头文件开头加上
#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
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28