我计划在c ++类中使用重载运算符,但不是作为成员函数。问题是运算符不应该处理类本身定义的数据类型,而应该处理类中定义的typedef。 我的代码摘录如下:
头文件中的类定义:
namespace myspace
{
class Exporter{
public:
Exporter(const Markov & MP);
Exporter(const Network & net);
~Exporter();
void Export(std::string filename);
typedef std::vector<int> pvi;
typedef std::vector<std::string> pvs;
protected:
void Export1(std::string filename, pvs Mydata);
void Export2(std::string filename, pvi Mydata2);
// Helper functions
friend std::ostream& operator<<(std::ostream&, const pvi& vi);
friend std::ostream& operator<<(std::ostream&, const pvs& vi);
...
private:
pvs Data1;
pvi Data2;
...
};
}
cpp文件中的实现:
using namespace myspace;
//===============================================================================
std::ostream& operator<<(std::ostream& os, const Exporter::pvi& vi)
{
os << "(";
std::copy(vi.begin(), vi.end()-1, std::ostream_iterator<int>(os, ","));
std::copy(vi.end()-1, vi.end(), std::ostream_iterator<int>(os));
os << ")";
return os;
}
//===============================================================================
std::ostream& operator<<(std::ostream& os, const Exporter::pvs& vi)
{
os << "(";
std::copy(vi.begin(), vi.end()-1, std::ostream_iterator<std::string>(os, ","));
std::copy(vi.end()-1, vi.end(), std::ostream_iterator<std::string>(os));
os << ")";
return os;
}
//===============================================================================
void Exporter::Export(std::string filename)
{
Export1(std::string filename, Data1);
Export2(std::string filename, Data2);
}
//==============================================================================
void Exporter::Exporter1(std::string filename,pvs Mydata_s)
{
std::ofstream outf;
outf.open(filename.c_str());
outf << Mydata_s << "\n";
outf.close();
}
//==============================================================================
void Exporter::Exporter2(std::string filename,pvi Mydata_i)
{
std::ofstream outf;
outf.open(filename.c_str());
outf << Mydata_i << "\n";
outf.close();
}
//==============================================================================
在编译期间,不会生成引用运算符的警告和错误。但输出似乎没有形成,因此看起来使用了标准/默认运算符。
是否有任何提示或建议如何克服?