所以我的模板类有些问题。
<!-- language: lang-c++ -->
template<class T>
class List {
class Counter
{
T real;
T imaginary;
Counter *next;
//....
public:
Counter(T a=0,T b=0);
virtual ~Counter();
friend ostream& operator<<(ostream&,Counter&);
friend ostream& operator<<(ostream&,List&);
};
Counter* first;
Counter* last;
//....
};
但我的方法存在一些问题。如果我写功能
template<class T> Counter operator/(Counter &one,...)
当我在VC ++ 10中查看Counter时,它会说
<error_type>&one
例如,。我应该在代码中的任何地方使用template<class T>
作为我的Counter类吗?
//Methods
//Counter. For example some methods
Counter operator/(Counter& one,Counter& two){}
ostream& operator<<(ostream&os,Counter&x){}
istream& operator>>(istream&is,Counter&x){}
//List
template<class T>void List<T>::add(Counter *T,int i,bool c){}
答案 0 :(得分:2)
这取决于您是否定义运算符(无论它们是成员函数还是全局运算符)在内部或在之外。
如果你在课程定义中这样做,则不需要template<T>
,也不需要List<T>
:
template <typename T>
class List
{
public:
class Counter
{
/* This is a global operator* defined inside the class, and
as friend. */
friend Counter operator*(const Counter &c1, const Counter &c2)
{
return Counter();
}
};
};
(请注意,我对operator*
的定义实际上并不实用,因为它总是返回一个空的Counter
对象。这只是为了演示语法。)
但是如果你在类之外定义运算符(因此也在List
的模板定义之外),你必须使用函数模板定义的完整语法:
template <typename T>
typename List<T>::Counter operator/(const typename List<T>::Counter &c1, const typename List<T>::Counter &c2)
{
return List<T>::Counter();
}
如您所见,这涉及三个步骤:
template <....>
... <
中包含的所有模板参数的名称放在>
上。List<T>::Counter
表示Counter
是嵌套的类型名称typename List<T>::Counter
因为Counter
嵌套在依赖类型中(即依赖于模板参数的类型)。