У меня есть два не шаблонных класса, 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"
Спасибо за помощь.