【发布时间】:2020-02-11 08:29:21
【问题描述】:
我有两个必须是模板的类模板 (C++)。我只是简化了他们的代码以显示问题的本质。如何将对象 (obj1) 从一个模板 (MyClass1) 传递到第二个模板 (MyClass2) 的另一个对象 (obj2)?我尝试通过模板参数和构造函数,但我仍然有编译错误。如何正确执行?重要的是,我不知道模板参数,因此解决方案是通用的,不适用于指定参数。对象应该通过指针或引用传递,我不需要它的副本。
template<int a, int b>
class MyClass1 {
public:
MyClass1() {
// Do something...
}
int foo(int x) {
return a * x + b;
}
};
template<double m, double n>
class MyClass2 {
public:
MyClass2() {
// Do something
}
double bar(int x) {
// Do something with x using object of MyClass1 and then with m...
}
double zet(int x) {
// Do something with x using object of MyClass1 and then with n...
}
};
int main() {
MyClass1<4, 3> obj1;
MyClass2<3.14, 2.56> obj2; // <-- How to pass obj1 here???
// Maybe that way?: MyClass2<3.14, 2.56, obj1> obj2;
// Or that way?: MyClass2<3.14, 2.56> obj2(obj1);
obj1.foo(12);
obj2.bar(1.234);
obj2.zet(5.678);
}
我不确定这是否与这个问题有关,但我正在使用标准设置在 Atmel Studio 7 中为 AVR 编写 C++ 代码。
【问题讨论】:
-
您可以在
MyClass2中创建一个模板构造函数,它将接受MyClass1类型的参数,并从中构造对象。 -
如果您想将
MyClass1的实例保留为MyClass2的成员,您可能会遇到麻烦,因为您使类型依赖于模板参数另一种类型。 -
另外,浮点模板参数在 C++20 之前是非法的。这段代码真的可以用你的编译器编译吗?
-
为什么所有这些模板参数?您的编译器将为您的类的每个不同实例化生成特定的类类型。通过查看您的代码,您似乎根本不需要模板,而是字段成员并将参数传递到构造函数参数中。
-
@Timo,你是对的。这个简化的代码无法编译。我只是想说明问题的本质。在实际代码中,没有整数,而是
uint8_t端口定义等。@Fareanor,这也是为什么这是模板的原因。我在某些端口和引脚上有一个设备,在其他端口和引脚上有其他设备。这很好,两者都有不同的类型。另一个优点是它可以减少程序的重量。
标签: c++ templates avr atmega atmelstudio