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;
}
我正在尝试声明一个通用变量,编译器似乎根据基 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;
}