循环包含错误,模板源文件

时间:2018-12-19 08:46:55

标签: c++ templates circular-dependency forward-declaration

我有两个非模板类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行以下。谢谢。

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"

谢谢您的帮助。

0 个答案:

没有答案