Ошибка кругового включения, исходные файлы шаблона - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть два не шаблонных класса, A и A :: nested, и шаблон класса B.

У меня проблема, когда шаблонный метод в классе A (A_method), определенный в a.Файл tpp (A.tpp), требует определения класса B, так как он пытается изменить член класса B внутри него.

В то же время метод класса B требует определения класса A, поскольку один из его параметров - это класс, вложенный в класс A (A :: nested).

Специфическая ошибкаэто:

error: invalid use of incomplete type 'class B<>'

Я проследил, что эта проблема возникла из компиляции B.cpp, где он затем #include B.hpp, который #includes A.hpp, который #include A.tpp,который #include B.hpp снова.

Я включил файлы ниже, они все короткие и ниже 30 строк.Спасибо.

types.hpp (просто пустой держатель класса для значимости)

#ifndef TYPES
#define TYPES

class defaulttype {};
class argtype     {};
class alttype     {};

#endif // TYPES

A.hpp

#ifndef A_HEADER
#define A_HEADER

#include "types.hpp"

template<typename = defaulttype>
class B;

class A
{
public:

    template<typename...>
    class nested{};

    B<>* data_member;

    B<alttype>* const second_data_member;

    template<typename Type>
    void A_method(B<Type>);

    A();
};

#include "A.tpp" //".tpp" is the extension I am using to indicate
                 //template source files, other places may use ".tcc" or ".ipp"
#endif //A_HEADER

A.tpp

#ifndef A_TPP
#define A_TPP

#include "B.hpp"

#include <iostream>

template<typename T>
void A::A_method(B<T> object)
{
    data_member->next = &object;
    std::cout << object.name;
}

#endif // A_TPP

A.cpp

#include "A.hpp"

A::A()
:second_data_member(new B<alttype>)
{}

B.hpp

#ifndef B_HEADER
#define B_HEADER

#include "A.hpp"
#include "types.hpp"

#include <iostream>

//default arg is defaulttype, previously forward declared as such in A.hpp
template<typename T>
class B
{
public:
    B* next;
};

template<>
class B<argtype> : public B<>
{
public:
    std::string name;

    template<typename...argpack>
    void B_func_requires_nested(A::nested<argpack...>);
};

#include "B.tpp"

#endif //B_HEADER

B.tpp

#ifndef B_TPP
#define B_TPP

template<typename...argpack>
void B<argtype>::B_func_requires_nested(A::nested<argpack...> object)
{}

#endif // B_TPP

B.cpp

#include "B.hpp"

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...