问问题
965 次
3 回答
4
你的方法有两个问题。第一个是_printnice
从属名称,因此您需要添加一个额外的typename
. 如果解决了这个问题,你最终会得到:
template<class F>
ostream& operator << (ostream& os, typename CMPLX<F>::_printnice const & p)
正如 Dietmar 在之前的回答中指出的那样,此代码的问题在于F
它处于不可演绎的上下文中,这将失败。
一种简单的解决方案是在代码范围内定义运算符_printnice
,其中typename
:
template <class F>
struct CMPLX {
//...
struct _printnice {
friend std::ostream& operator<<( std::ostream& o, _printnice const & p ) {
// print here
return o;
}
}
//...
};
在 的定义中_printnice
,类型被认为是一种类型,因此typename
不再需要 。重载operator<<
将由 Argument Dependent Lookup 找到,并且由于它引用了该类型的特定实例化,因此无需推导模板参数。
于 2012-10-15T17:06:39.127 回答
1
在函数中:
template <typename F>
std::ostream& operator<<( std::ostream& os, CMPLX<F>::_printnice p);
F
不在可演绎的上下文中。(见§14.8.2.5。)
于 2012-10-15T16:59:25.927 回答
0
注意。这不是一个答案。大卫已经回答了。FWIW,只是修复了一些问题,因此它可以在 gcc 4.72 下编译和运行。
#include <iostream>
#include <stdio.h>
using namespace std;
template <class F>
struct CMPLX {
F Re, Im;
struct _printnice {
F Re, Im;
string sep;
_printnice(const F& Re, const F& Im, const string& sep) : Re(Re), Im(Im), sep(sep) {}
friend ostream& operator << (ostream& os, const _printnice& p){
cout << p.Re << p.sep << p.Im;
return os;
}
};
CMPLX <F> (F Re, F Im) : Re(Re), Im(Im) {}
_printnice PrintNice(const string& sep="\t"){
return _printnice(Re, Im, sep);
}
};
template<class F>
ostream& operator << (ostream& os, const CMPLX<F> c){
cout << c.Re << " + " << c.Im << "i";
return os;
}
int main() {
CMPLX<float> c(2.0,1.0);
cout << c << endl;
cout << c.PrintNice() << endl;
}
//result
/*
2 + 1i
2 1
*/
于 2012-10-15T17:29:40.013 回答