C++模板编程问题,各种报错,但一直找不到错,求大侠们指导,感激不尽~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

云梦泽1989 2013-11-26 07:57:15
在实现一个C++模板类时出现诸多错误,刚入手模板编程,找错找了大半天,未果,纠结中,求助大神们指导,感激不尽。这是一个类声明,定义部分感觉不会出错,大多也类似,只给出了部分
编译错误报告 语法错误 :
1. 缺少“;”(在“<”的前面)——报错行1
2: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int——报错行1(我传入模板实参为int)
代码如下:

template<typename T> class max_subarray;//前置声明
template<typename T> std::istream &operator>>(std::istream &is, const max_subarray<T> &target)
{
is >> target.varray.push_back();
return is;
}
template<typename T>
class max_subarray
{
public:
friend std::istream &operator>> <T>(std::istream &is, const max_subarray<T> &target);

max_subarray() = default;//默认构造函数
pair<size_t,size_t> get_index() const;//保存索引对
T &get_max_sum() const;//获取器
private:
//工具函数
void set_index(const size_t startIndex,const size_t endIndex);//设置器
void set_max_sum(const T maxSum);//设置器
void find_max_every_subarray(const vector<T> &vArray, const size_t start);
void find_max_subarray(const vector<T> &vArray);

//私有成员
pair<size_t, size_t> index_range;
T max_sum;
vector<T> varray;
};

//实现
template<typename T>
pair<size_t, size_t> max_subarray<T>::get_index() const
{
return{ first, second };
}

template<typename T>
T &max_subarray<T>::get_max_sum() const
{
return max_sum;
}

template<typename T>
void max_subarray<T>::set_index(size_t startIndex, size_t endIndex)
{
index_range.first = startIndex;
index_range.second = endIndex;
}
...全文
517 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
云梦泽1989 2013-11-28
  • 打赏
  • 举报
回复
引用 10 楼 wildcrazy 的回复:
[quote=引用 9 楼 zhao4zhong1 的回复:] “模板编译错误提示信息很难懂” 是 “使用模板编写类型无关代码很方便” 的代价! 模板是一种语法糖。 语法糖越甜,编译调试查错越苦!
赞![/quote]
引用 11 楼 lpcads 的回复:
[quote=引用 9 楼 zhao4zhong1 的回复:] “模板编译错误提示信息很难懂” 是 “使用模板编写类型无关代码很方便” 的代价! 模板是一种语法糖。 语法糖越甜,编译调试查错越苦!
好象那本书上看到过[/quote]说实话,还是想吃糖,早晚记得刷牙就好呀
云梦泽1989 2013-11-28
  • 打赏
  • 举报
回复
[quote=引用 9 楼 zhao4zhong1 的回复:] “模板编译错误提示信息很难懂” 是 “使用模板编写类型无关代码很方便” 的代价! 模板是一种语法糖。 语法糖越甜,编译调试查错越苦! [/quote看来糖越甜越苦
赵4老师 2013-11-27
  • 打赏
  • 举报
回复
“模板编译错误提示信息很难懂” 是 “使用模板编写类型无关代码很方便” 的代价! 模板是一种语法糖。 语法糖越甜,编译调试查错越苦!
云梦泽1989 2013-11-27
  • 打赏
  • 举报
回复
引用 7 楼 xyzinfernity 的回复:
#include <iostream>
#include <vector>

using namespace std;

template<typename T> class max_subarray;//前置声明
template<typename T> std::istream &operator>>(std::istream &is, const max_subarray<T> &target)
{
	is >> target.varray.push_back();
	return is;
}
template<typename T>
class max_subarray
{
public:
	friend std::istream &operator>> <T>(std::istream &is, const max_subarray<T> &target);

//	max_subarray() = default;//默认构造函数
	pair<size_t,size_t> get_index() const;//保存索引对
	T &get_max_sum() const;//获取器
private:
	//工具函数
	void set_index(const size_t startIndex, const size_t endIndex);//设置器
	void set_max_sum(const T maxSum);//设置器
	void find_max_every_subarray(const vector<T> &vArray, const size_t start);
	void find_max_subarray(const vector<T> &vArray);

	//私有成员
	pair<size_t, size_t> index_range;
	T max_sum;
	vector<T> vArray;
};

//实现
template<typename T>
pair<size_t, size_t> max_subarray<T>::get_index() const
{
	return{ first, second };
}

template<typename T>
T &max_subarray<T>::get_max_sum() const
{
	return max_sum;
}

template<typename T>
void max_subarray<T>::set_index(size_t startIndex, size_t endIndex)
{
	index_range.first = startIndex;
	index_range.second = endIndex;
}

int main()
{
	return 0;
}
你新建一个控制台程序,用我的代码替换下看看报错没
可以,谢谢你,但没明白问题在哪里,头文件我先前也是有的,只是没复制过来,构造函数=default是新语法,我加上去也没错~~~
lpcads 2013-11-27
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
“模板编译错误提示信息很难懂” 是 “使用模板编写类型无关代码很方便” 的代价! 模板是一种语法糖。 语法糖越甜,编译调试查错越苦!
好象那本书上看到过
m_hangj 2013-11-27
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
“模板编译错误提示信息很难懂” 是 “使用模板编写类型无关代码很方便” 的代价! 模板是一种语法糖。 语法糖越甜,编译调试查错越苦!
赞!
xyzinfernity 2013-11-26
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>

using namespace std;

template<typename T> class max_subarray;//前置声明
template<typename T> std::istream &operator>>(std::istream &is, const max_subarray<T> &target)
{
	is >> target.varray.push_back();
	return is;
}
template<typename T>
class max_subarray
{
public:
	friend std::istream &operator>> <T>(std::istream &is, const max_subarray<T> &target);

//	max_subarray() = default;//默认构造函数
	pair<size_t,size_t> get_index() const;//保存索引对
	T &get_max_sum() const;//获取器
private:
	//工具函数
	void set_index(const size_t startIndex, const size_t endIndex);//设置器
	void set_max_sum(const T maxSum);//设置器
	void find_max_every_subarray(const vector<T> &vArray, const size_t start);
	void find_max_subarray(const vector<T> &vArray);

	//私有成员
	pair<size_t, size_t> index_range;
	T max_sum;
	vector<T> vArray;
};

//实现
template<typename T>
pair<size_t, size_t> max_subarray<T>::get_index() const
{
	return{ first, second };
}

template<typename T>
T &max_subarray<T>::get_max_sum() const
{
	return max_sum;
}

template<typename T>
void max_subarray<T>::set_index(size_t startIndex, size_t endIndex)
{
	index_range.first = startIndex;
	index_range.second = endIndex;
}

int main()
{
	return 0;
}
你新建一个控制台程序,用我的代码替换下看看报错没
云梦泽1989 2013-11-26
  • 打赏
  • 举报
回复
引用 5 楼 jerry_dqh 的回复:
这种错误不是模板本身的问题。基本少没文件或者某个类型没有定义。提示不准确
检查了好多遍,刚开始学模板编程这部分,调试起来真心困难,提示错误往往不明确呀
碼上道 2013-11-26
  • 打赏
  • 举报
回复
这种错误不是模板本身的问题。基本少没文件或者某个类型没有定义。提示不准确
云梦泽1989 2013-11-26
  • 打赏
  • 举报
回复
引用 3 楼 xyzinfernity 的回复:
楼主应该是忘记加头文件了 #include <vector>没加吧,导致无法识别vector所以提示加逗号 还有楼主这句 void set_index(const size_t startIndex,const size_t endIndex);//设置器 仔细看看,你用的逗号是中文的逗号,而不是英文逗号, 然后max_subarray() = default;//默认构造函数 这句会报错error C2253: “max_subarray<T>”: 纯说明符或抽象重写说明符只允许在虚函数上使用 我觉得没必要加这句吧直接注释了
嗯,先多谢你了,头文件我是加了的,这个不会错,默认构造函数我是一直习惯这么写了,这儿也不会有问题的,纠结呀~~~
xyzinfernity 2013-11-26
  • 打赏
  • 举报
回复
楼主应该是忘记加头文件了 #include <vector>没加吧,导致无法识别vector所以提示加逗号 还有楼主这句 void set_index(const size_t startIndex,const size_t endIndex);//设置器 仔细看看,你用的逗号是中文的逗号,而不是英文逗号, 然后max_subarray() = default;//默认构造函数 这句会报错error C2253: “max_subarray<T>”: 纯说明符或抽象重写说明符只允许在虚函数上使用 我觉得没必要加这句吧直接注释了
云梦泽1989 2013-11-26
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
template<typename T> class max_subarray;//前置声明 不能加分号
不对呀,我看《C++Promer第五版》P589页前置声明是一条语句,是有分号的啊。。。
worldy 2013-11-26
  • 打赏
  • 举报
回复
template<typename T> class max_subarray;//前置声明 不能加分号

65,179

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧