gpt4 book ai didi

C++ 类嵌套到模板类中

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:36 25 4
gpt4 key购买 nike

所以我的模板类有一些问题。

<!-- 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){}

最佳答案

这取决于您是在类定义的内部还是在类定义的外部定义运算符(无论它们是成员函数还是全局运算符)。

如果您在类定义中执行此操作,则不需要 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();
}

如您所见,这涉及三个步骤:

  1. 输入template <....> , 所有模板参数的名称都包含在 < 中... >在定义之前。
  2. 使用List<T>::Counter表示Counter是一个嵌套的类型名
  3. 使用typename List<T>::Counter因为Counter嵌套到一个依赖类型(即依赖于模板参数的类型)。

关于C++ 类嵌套到模板类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14041459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com