文件ex1.hpp(模板类的定义):

#ifndef EX1_HPP
#define EX1_HPP

#include "ex2.hpp"

template <class T>
class Ex1{
public:
    void Ex1method(){
        Ex2 a; // using nontemplate class object
        a.Ex2method();
    }
};

#endif


文件ex2.hp​​p(非模板类的定义):

#ifndef EX2_HPP
#define EX2_HPP

#include "ex1.hpp"

class Ex2{
public:
    void Ex2method();
};

#endif


文件ex2.cpp(非模板类方法的定义):

#include "ex2.hpp"

void Ex2::Ex2method()
{
    Ex1<int> e; // using template class object
    e.Ex1method();
}


编译错误:

ex1.hpp:10:9: error: ‘Ex2’ was not declared in this scope
ex1.hpp:10:13: error: expected ‘;’ before ‘a’
ex1.hpp:11:9: error: ‘a’ was not declared in this scope


非模板类和模板类之间的这种循环依赖关系如何解决?我不能为实现文件定义非模板类方法,因为这会导致链接器错误。如果我在文件ex1.hpp中放置Ex2类的前向声明,则错误是:

error: invalid use of incomplete type ‘struct Ex2’
error: forward declaration of ‘struct Ex2’

最佳答案

不要在ex1.hpp中包含ex2.hpp,在此没有必要。您的标头没有循环依赖关系。

在您的ex1.hpp文件中包含两个标头(或仅包含.cpp),并且一切都应该不错。

关于c++ - 模板类和非模板类的循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9240895/

10-12 23:51