gpt4 book ai didi

c++ - 如何声明采用模板类的嵌套类的全局友元函数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:08 27 4
gpt4 key购买 nike

我一直在尝试各种声明,但没有做对,遇到各种错误,例如语法错误和链接错误。这是对我来说有意义的最后一次尝试。 我做错了什么?

template<class T>
class Array
{
public:
class Iterator
{
public:
friend Iterator operator+<>(const int,typename const Array<T>::Iterator&);
};
};

template <class T>
typename Array<T>::Iterator operator+(const int,typename const Array<T>::Iterator& it)
{
return it;
}

和主要的:

int main()
{
Array<int> arr;
Array<int>::Iterator it;
it=5+it;
return 0;
}

我收到这个错误:

 error C2785: 'Array<T>::Iterator operator +(const int,const Array<T>::Iterator &)' and 'Array<T>::Iterator +(const int,const Array<T>::Iterator &)' have different return types

最佳答案

一方面,typename const Array<T>::Iterator是错的。应该是const typename Array<T>::Iterator .自 typename是为了帮助编译器知道如何处理 :: 之后的事情, 总是把它放在你的 A::B::C 的左边-型模式。

您不能将函数模板的特化命名为 friend在声明通用模板之前。在类型 Array<T>::Iterator 之前,您不能声明该模板已经宣布。

您可以做的一件事:将整个函数模板设为 friend ,而不仅仅是一个专业。

template<class T>
class Array
{
public:
class Iterator
{
public:
template <class U> friend
typename Array<U>::Iterator operator+(
const int, const typename Array<U>::Iterator&);
};
};

template <class T>
typename Array<T>::Iterator operator+(
const int, const typename Array<T>::Iterator& it)
{
return it;
}

授予friend有点草率发货,但完成工作。

或者,如果您愿意移动嵌套类的定义 Iterator稍后在文件中:

template<class T>
class Array
{
public:
class Iterator;
};

template <class T>
typename Array<T>::Iterator operator+(
const int, const typename Array<T>::Iterator& it);

template <class T>
class Array<T>::Iterator
{
public:
friend Iterator operator+<T>(const int, const Iterator&);
};

template <class T>
typename Array<T>::Iterator operator+(
const int, const typename Array<T>::Iterator& it)
{
return it;
}

这负责如何声明和定义它们。不幸的是,这operator+不好用,因为模板参数推导规则的细节....

我可能会尝试通过制作 Iterator 来解决最后一个问题非嵌套模板:

namespace Array_detail {
template <class T> class Array_Iterator;

template <class T>
Array_Iterator<T> operator+(int, const Array_Iterator<T>&);

template <class T>
class Array_Iterator {
friend Array_Iterator operator+<>(int, const Array_Iterator&);
};
}

template <class T>
class Array {
public:
typedef Array_detail::Array_Iterator<T> Iterator;
};

关于c++ - 如何声明采用模板类的嵌套类的全局友元函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16904261/

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