关于class内定义inline的问题

学习《essential c++》第四章的时候遇到了这样一个问题
这是Triangular_iterator.h

#pragma once
#include<iostream>
#include<string>


class Triangular_iterator
{

public:
    Triangular_iterator(int index) :_index(index - 1) {}
    
    bool operator== (const Triangular_iterator&) const;
    bool operator!=(const Triangular_iterator&) const;
    int operator*()const;
    
    Triangular_iterator& operator++();
    Triangular_iterator operator++(int);

    //inline void check_integrity()const;



private:
    inline void check_integrity()const;
    int _index;
};

这是它的.cpp

#include "Triangular_iterator.h"
#include"Triangular.h"

inline bool Triangular_iterator::
operator==(const Triangular_iterator &rhs)const
{
    return _index == rhs._index;
}

inline bool Triangular_iterator::
operator!=(const Triangular_iterator &rhs)const
{
    return !(*this == rhs);
}

void Triangular_iterator::
check_integrity()const
{
    //if (_index >= Triangular::_max_elems)
    //    throw iterator_overflow();

    if (_index >= Triangular::_elems.size())
        Triangular::gen_elements(_index + 1);
}


int Triangular_iterator::
operator*()const
{
    check_integrity();
    return Triangular::_elems[_index];
}

Triangular_iterator& Triangular_iterator::
operator++()
{
    ++_index;
    check_integrity();
    return *this;
}

Triangular_iterator Triangular_iterator::
operator++(int)
{
    Triangular_iterator tmp = *this;
    ++_index;
    check_integrity();
    return tmp;
}

然后我在main()里面跑检验程序,如果我在Triangular_iterator.cpp中的加上incline就会报无法解析的外部符号,如果去掉就可以正常使用。请问这是为啥?书上都是加了inline的,我加了就报错。
这是我在main里面跑的代码


```c++
Triangular tri(20);
    Triangular::iterator it = tri.begin();
    Triangular::iterator end_it = tri.end();

    cout << "Triangular Series of " << tri.length() << " elements\n";
    /*cout << tri << endl;*/
    while (it != end_it)
    {
        cout << *it << ' ';
        ++it;
    }
    cout << endl;


求解

这是我在.cpp中加了inline的情况

#include "Triangular_iterator.h"
#include"Triangular.h"

inline bool Triangular_iterator::
operator==(const Triangular_iterator &rhs)const
{
    return _index == rhs._index;
}

inline bool Triangular_iterator::
operator!=(const Triangular_iterator &rhs)const
{
    return !(*this == rhs);
}

inline void Triangular_iterator::
check_integrity()const
{
    //if (_index >= Triangular::_max_elems)
    //    throw iterator_overflow();

    if (_index >= Triangular::_elems.size())
        Triangular::gen_elements(_index + 1);
}


inline int Triangular_iterator::
operator*()const
{
    check_integrity();
    return Triangular::_elems[_index];
}

inline Triangular_iterator& Triangular_iterator::
operator++()
{
    ++_index;
    check_integrity();
    return *this;
}

inline Triangular_iterator Triangular_iterator::
operator++(int)
{
    Triangular_iterator tmp = *this;
    ++_index;
    check_integrity();
    return tmp;
}