Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何定义嵌套类中的运算符_C++_Class_Nested_Operator Overloading - Fatal编程技术网

C++ C++;如何定义嵌套类中的运算符

C++ C++;如何定义嵌套类中的运算符,c++,class,nested,operator-overloading,C++,Class,Nested,Operator Overloading,我在定义嵌套类中的运算符时遇到了问题,该类也是模板化的。我知道如何在.h文件中声明和定义它,但我想在.h文件中声明它并在.hpp文件中定义它。例如: 清单h template <typename T> class List { public: class const_iterator { //nested class //.... const T & operator*() const; }; }; 模板 班级名单{ 公众

我在定义嵌套类中的运算符时遇到了问题,该类也是模板化的。我知道如何在.h文件中声明和定义它,但我想在.h文件中声明它并在.hpp文件中定义它。例如:

清单h

template <typename T>
class List {
public:
    class const_iterator {   //nested class
        //....
        const T & operator*() const;
    };
};
模板
班级名单{
公众:
类常量迭代器{//嵌套类
//....
常数T&运算符*()常数;
};
};
下面是我不太明白的部分:

List.hpp

#include "List.h"
template <typename T>
typename List <T>::const_iterator & List <T>:: operator*() const //error line
{
    //do stuff
}
#包括“List.h”
模板
typename列表::常量迭代器&列表::运算符*()常量//错误行
{
//做事
}
我在line.hpp的第4行收到的错误是:

“运算符*”的行外定义与“列表”中的任何声明都不匹配


我正在寻找一种只涉及修复.hpp文件的解决方案。

正如错误所说,您的定义与您的声明不匹配。您已经声明了类
列表::常量迭代器
的成员
运算符*
,该类返回
常量T&
,但您的定义是针对类
列表
的成员
运算符*
,该类返回
列表::常量迭代器&

类模板的成员函数的定义,无论是否嵌套,都遵循与任何其他函数相同的模式:
ReturnType FunctionName(ParameterList)

该声明的适当定义是:

  template <typename T>
  const T& List<T>::const_iterator::operator*( ) const
//^^^^^^^^                                    ^
// |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
// Return type        |                       (empty) parameter list
//                    Function name
  {
      //...
  }
模板
常量T&List::常量迭代器::运算符*()常量
//^^^^^^^^                                    ^
// |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
//返回类型|(空)参数列表
//函数名
{
//...
}

正如错误所述,您的定义与您的声明不匹配。您已经声明了类
列表::常量迭代器
的成员
运算符*
,该类返回
常量T&
,但您的定义是针对类
列表
的成员
运算符*
,该类返回
列表::常量迭代器&

类模板的成员函数的定义,无论是否嵌套,都遵循与任何其他函数相同的模式:
ReturnType FunctionName(ParameterList)

该声明的适当定义是:

  template <typename T>
  const T& List<T>::const_iterator::operator*( ) const
//^^^^^^^^                                    ^
// |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
// Return type        |                       (empty) parameter list
//                    Function name
  {
      //...
  }
模板
常量T&List::常量迭代器::运算符*()常量
//^^^^^^^^                                    ^
// |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
//返回类型|(空)参数列表
//函数名
{
//...
}

您的.hpp正在尝试定义一个
运算符*
,该运算符是
列表的成员,并返回对
列表::常量迭代器的引用。这不是你的.h声明的。它声明一个
操作符*
,该操作符是
列表::常量迭代器的成员,并返回对
T
的引用

请尝试以下方法:

#include "List.h"

template <typename T>
const T& List<T>::const_iterator::operator*() const
{
    //do stuff
}
#包括“List.h”
模板
常量T&List::常量迭代器::运算符*()常量
{
//做事
}

您的.hpp正在尝试定义一个
运算符*
,该运算符是
列表的成员,并返回对
列表::常量迭代器的引用。这不是你的.h声明的。它声明一个
操作符*
,该操作符是
列表::常量迭代器的成员,并返回对
T
的引用

请尝试以下方法:

#include "List.h"

template <typename T>
const T& List<T>::const_iterator::operator*() const
{
    //do stuff
}
#包括“List.h”
模板
常量T&List::常量迭代器::运算符*()常量
{
//做事
}

现在,如果我有一个类似于:常量迭代器和运算符++();在.h文件中?现在如果我有一个类似于:const_iterator&operator++();在.h文件中?