C++ "assuming" 模板中的模板类型 class

C++ "assuming" template type in a template class

我正在尝试声明一个通用变量,编译器似乎根据基 class 假定类型。

这是我的部分代码:

class CompGate:public Gate<bool>{
protected:
    virtual bool eval()const=0;
    Gate* _v1;
    Gate* _v2;
public:
    template<class T, class T2>
    void connectInputs(Gate<T>* v1, Gate<T2>* v2){
        _v1=v1;
        _v2=v2;
    }
};

当我在主函数中使用 connectInputs 时,我得到 cannot convert 'Gate<double>*' to 'Gate<bool>*' in assignement

由于某些原因,Gate* _v1 似乎被定义为 Gate<bool>* v1

对不起我的英语..

此示例使用 makeGate 模板函数来制作门,而无需指定门的类型。所有 CompGates 都派生自同一个基类,因此您以后不需要知道它比较的是什么类型来调用它的 eval 函数。

#include <iostream>

template<class A>
class Gate {
    public:
    ~Gate() {}
    A data;
    A eval() { return data; }
};

class CompGateBase {
    public:
    virtual ~CompGateBase();
    virtual bool eval() = 0;
};

template<class T1, class T2>
class CompGate: public Gate<bool>{
public:
    bool eval() { return _v1->eval() > _v2->eval(); }
    void connectInputs (T1& v1, T2& v2) {
        _v1 = &v1;
        _v2 = &v2;
    }
protected:
    T1* _v1;
    T2* _v2;
};

template<class G1, class G2>
CompGate<G1, G2> makeGate(G1& gate1, G2& gate2) {
    CompGate<G1, G2> compGate;
    compGate.connectInputs(gate1, gate2);
    return compGate;
}

int main() {
    Gate<double> G1;
    G1.data = 8.8;
    Gate<int> G2;
    G2.data = 8;

    auto gate = makeGate(G1, G2);
    std::cout << gate.eval() << std::endl;

    return 0;
}