C++ 如何在前面定义的类X中的代码中使用后面定义的类Y?

C++ 如何在前面定义的类X中的代码中使用后面定义的类Y?,c++,class,C++,Class,我有这段代码,它编译成功了 #include <iostream> #include <memory> template <typename T> class Expression { public: T _data; Expression() {} Expression(T data) { _data = data; } void foo(); }; template <type

我有这段代码,它编译成功了

#include <iostream>
#include <memory>
template <typename T>
class Expression {
    public:
    T _data;

    Expression() {}

    Expression(T data) {
        _data = data;
    }
    void foo();
};



template <typename T>
class ConstExpression : public Expression<T> {
    public:
    ConstExpression() {}
    ConstExpression(T data) {
        this->_data = data;
    }
};


template <typename T>
void Expression<T>::foo() {
    std::shared_ptr<ConstExpression<T>> temp(new Expression);
    std::shared_ptr<ConstExpression<T>> temp2(new ConstExpression<T>());
    ConstExpression<T> foo2(5);
}

int main() {
    return 0;
}
#包括
#包括
模板
类表达式{
公众:
T_数据;
表达式(){}
表达式(T数据){
_数据=数据;
}
void foo();
};
模板
类ConstExpression:公共表达式{
公众:
ConstExpression(){}
常量表达式(T数据){
此->\u数据=数据;
}
};
模板
void表达式::foo(){
std::shared_ptr temp(新表达式);
std::shared_ptr temp2(new ConstExpression());
const2(5);
}
int main(){
返回0;
}
现在,如果我执行以下操作,或者给我的函数foo一个constexpression类型的输入参数,我会得到一个错误:main.cc:15:25:错误:使用未声明的标识符“constexpression”;你是说“表情”吗? 在我的实际代码中,我的函数接受一个ConstExpression类型的输入参数,我也做了一个越界声明,但得到了一个类似的错误

#include <iostream>
#include <memory>
template <typename T>
class Expression {
    public:
    T _data;

    Expression() {}

    Expression(T data) {
        _data = data;
    }
    void foo() {
        std::shared_ptr<ConstExpression<T>> temp(new Expression);
        std::shared_ptr<ConstExpression<T>> temp2(new ConstExpression<T>());
        ConstExpression<T> foo2(5);
    }
};



template <typename T>
class ConstExpression : public Expression<T> {
    public:
    ConstExpression() {}
    ConstExpression(T data) {
        this->_data = data;
    }
};

int main() {
    return 0;
}
#包括
#包括
模板
类表达式{
公众:
T_数据;
表达式(){}
表达式(T数据){
_数据=数据;
}
void foo(){
std::shared_ptr temp(新表达式);
std::shared_ptr temp2(new ConstExpression());
const2(5);
}
};
模板
类ConstExpression:公共表达式{
公众:
ConstExpression(){}
常量表达式(T数据){
此->\u数据=数据;
}
};
int main(){
返回0;
}

Expression
类中,您使用
ConstExpression
,但
ConstExpression
尚未声明

您可以通过在使用前向前声明
ConstExpression
来克服这一问题:

template<typename T>
class ConstExpression;

template<typename T>
class Expression { ... };
模板
类表达式;
模板
类表达式{…};

Expression
类中,您使用
ConstExpression
,但
ConstExpression
尚未声明

您可以通过在使用前向前声明
ConstExpression
来克服这一问题:

template<typename T>
class ConstExpression;

template<typename T>
class Expression { ... };
模板
类表达式;
模板
类表达式{…};

您需要使用转发声明。看看这篇文章:
std::shared_ptr temp(新表达式)即使其他问题得到解决也不合法
Expression
是一个模板,您没有提供任何模板参数,即使您提供了,它也不是
ConstExpression
的派生;真正的问题(除了上面提到的问题)是你有一个基类知道一个派生类。对于您试图解决的问题,继承似乎不是正确的解决方案。您需要使用前向声明。看看这篇文章:
std::shared_ptr temp(新表达式)即使其他问题得到解决也不合法
Expression
是一个模板,您没有提供任何模板参数,即使您提供了,它也不是
ConstExpression
的派生;真正的问题(除了上面提到的问题)是你有一个基类知道一个派生类。对于您试图解决的问题,继承似乎不是正确的解决方案。