首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何转发声明类模板?

如何转发声明类模板?
EN

Stack Overflow用户
提问于 2021-04-28 10:07:59
回答 3查看 56关注 0票数 0

我试图实现规范pattern.In --我有一个规范抽象类和一个重载&操作符,它返回AndSpecification,它实际上是从class.Now派生的--存在循环依赖关系b/w AndSpecification的问题,Specification.Specification是类模板,AndSpecification也是。

Specification.h

代码语言:javascript
复制
//#include "AndSpecification.h"- this creates a problem
template <class T>
class Specification
{
 public:
     Specification()
     {

     }

     virtual ~Specification()
     {

     }
     virtual bool isSatisfied(T *item)=0;
     AndSpecification<T>  operator&&(Specification &other)
     {
         return AndSpecification<T>(*this,other);
     }
};

AndSpecification.h

代码语言:javascript
复制
#include "Specification.h"

template <class T>

class AndSpecification : public Specification<T>
{
    Specification <T> *first;
    Specification <T> *second;
public:
    AndSpecification(Specification <T> *first,Specification <T> * second);

    // Specification interface
public:
    bool isSatisfied(T *item) override;
};

如能提供帮助,将不胜感激。完整代码:https://github.com/princekm/specification.git

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-28 10:30:09

您需要前向声明,并移动方法的定义,这两个类定义都需要在这些类之后:

代码语言:javascript
复制
// Specification.h
#pragma once
template <class T> class AndSpecification;

template <class T>
class Specification
{
 public:
     Specification() {}

     virtual ~Specification() {}
     virtual bool isSatisfied(T *item)=0;
     AndSpecification<T>  operator&&(Specification &other);
};

#include "Specification.inl"
代码语言:javascript
复制
// AndSpecification.h
#pragma once

#include "Specification.h"
template <class T>
class AndSpecification : public Specification<T>
{
    Specification <T> *first;
    Specification <T> *second;
public:
    AndSpecification(Specification <T> *first,Specification <T> * second);

    // Specification interface
public:
    bool isSatisfied(T *item) override;
};
代码语言:javascript
复制
// Specification.inl
#pragma once
#include "Specification.h"
#include "AndSpecification.h"
template <class T>
AndSpecification<T>  Specification<T>::operator&&(Specification &other)
{
    return AndSpecification<T>(this, &other);
}

演示

票数 1
EN

Stack Overflow用户

发布于 2021-04-28 10:29:04

向前声明:

代码语言:javascript
复制
template <class T> AndSpecification;

以下内容是正确的(通过删除示例中的纯虚拟方法):

代码语言:javascript
复制
template <class T> class AndSpecification;
template <class T>
class Specification
{
 public:
     Specification()
     {

     }

     virtual ~Specification()
     {

     }
//     virtual bool isSatisfied(T *item)=0;
     AndSpecification<T>  operator&&(Specification &other)
     {
         return AndSpecification<T>(*this,other);
     }
};
template <class T>

class AndSpecification : public Specification<T>
{
    Specification <T> *first;
    Specification <T> *second;
public:
    AndSpecification(Specification <T> *first,Specification <T> * second);

    // Specification interface
public:
    bool isSatisfied(T *item) override;
};

class A{};

int main() {
    Specification<A> a;
}
票数 0
EN

Stack Overflow用户

发布于 2021-04-28 10:31:51

与前向声明(请参阅其他答案)不同,您可以考虑Specification不一定需要了解AndSpecification。我是说,反正这是个模板。如果向Specifiacation添加模板模板参数,如下所示:

代码语言:javascript
复制
template <class T,template<typename> class X>
class Specification
{
 public:
     Specification()
     {

     }

     virtual ~Specification()
     {

     }
     virtual bool isSatisfied(T *item)=0;
     X<T>  operator&&(Specification &other)
     {
         return X<T>(*this,other);
     }
};

然后,只有当您实例化它时,您才需要知道这两者:

代码语言:javascript
复制
 #include "Specification.h"
 #incldue "AndSpecification.h"
 template <typename T>
 using Specification_with_And = Specification<T,AndSpecification>;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67298139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档