我有两个实例,我正在重载<<运算符,它总是默认为下面显示的第一个是否有任何方法可以为自定义类Shape识别第二个函数?
谢谢,
约翰
首次超载:
template <class T>
ostream & operator << (ostream & out, vector <T> & vec)
{
for (unsigned int i = 0;i<vec.size()-1; i++) {
out << vec[i] << " ";
}
out << vec[vec.size() - 1];
return out;
}
第二次超载:
ostream & operator << (ostream & out, vector <Shape> & vec)
{
for (unsigned int i = 0;i<vec.size(); i++)
{
out << "##" << vec[i].get_shape_type << i << endl << vec[i] << endl;
}
return out;
}
编辑2012年7月25日:
我添加了相同的文件
#ifndef _UTILS_H_
#define _UTILS_H_
#include <iostream>
#include <vector>
#include <algorithm>
#include "Shape.H"
using namespace std;
template <class T>
ostream & operator << (ostream & out, vector <T> & vec)
{
for (unsigned int i = 0;i<vec.size()-1; i++) {
out << vec[i] << " ";
}
out << vec[vec.size() - 1];
return out;
}
template <class Shape>
ostream & operator << (ostream & out, vector <Shape> & vec)
{
for (unsigned int i = 0;i<vec.size(); i++)
{
out << "## " <<vec[i];
}
return out;
}
#endif
并尝试编译,我收到此错误
../include/utils.H:22:11:错误:重新定义'template std :: ostream&amp; operator&lt;&lt;(std :: ostream&amp;,std :: vector&amp;)' ../include/utils.H:11:11:错误:'template std :: ostream&amp;先前在此声明的运算符&lt;&lt;(std :: ostream&amp;,std :: vector&amp;)'
答案 0 :(得分:1)
您的两个功能具有相同的名称和签名。只有模板参数名称(T,SHAPE)不同。这就是编译器抱怨您正在重新定义相同功能的原因。您需要使签名不同或添加std::enable_if
。
答案 1 :(得分:1)
我认为编辑中的特化语法是错误的。要正确执行模板特化,而不是:
template <class Shape>
ostream & operator << (ostream & out, vector <Shape> & vec)
你需要:
template <>
ostream & operator << <Shape> (ostream & out, vector <Shape> & vec)
请参阅this ref。
答案 2 :(得分:0)
我不是模板专业化方面的专家。但是,另一种解决方案是修改Shape::operator<<()
以包含所有输出。
答案 3 :(得分:0)
您的'重载'基本上与具有不同命名的模板参数的功能相同,因此重新声明错误。你必须使它们实际超载。 Shape
版本不一定是模板,只是一个函数。你也许想通过const引用传递vector:
ostream & operator << (ostream & out, vector<Shape> const& vec)
{
for (unsigned int i = 0;i<vec.size(); i++)
{
out << "## " <<vec[i];
}
return out;
}