我有两个非模板类A和A :: nested,以及一个类模板B。
我有一个问题,在.tpp文件(A.tpp)中定义的类A(A_method)中的模板化方法需要定义类B,因为它试图在其中修改类B的成员。
同时,类B中的方法需要定义类A,因为其参数之一是嵌套在类A(A :: nested)内的类。
具体错误是:
error: invalid use of incomplete type 'class B<>'
我追溯到此问题是由于B.cpp的编译引起的,在此过程中#includes B.hpp,其中#includes A.hpp,其中#includes A.tpp,又#includes B.hpp。
我已将以下文件包括在内,它们都很短且在30行以下。谢谢。
#ifndef TYPES
#define TYPES
class defaulttype {};
class argtype {};
class alttype {};
#endif // TYPES
#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
#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
#include "A.hpp"
A::A()
:second_data_member(new B<alttype>)
{}
#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
#ifndef B_TPP
#define B_TPP
template<typename...argpack>
void B<argtype>::B_func_requires_nested(A::nested<argpack...> object)
{}
#endif // B_TPP
#include "B.hpp"
谢谢您的帮助。