Ваш код не компилируется с C ++ 11 из-за этого:
Параметр шаблона нетипичного типа должен иметь структурный тип, который является одним из следующих типов (необязательно, квалифицированным cv) квалификаторы игнорируются):
- lvalue ссылочный тип (для объекта или для функции);
- целочисленный тип;
- тип указателя (для объекта или на функцию);
- указатель на тип члена (на объект-член или на функцию-член);
- тип перечисления;
- std :: nullptr_t; (начиная с C ++ 11)
- тип с плавающей точкой; (начиная с C ++ 20)
Что касается вашей основной проблемы, вы можете сделать что-то вроде этого:
template<int m, int n, typename Obj1Type>
class MyClass2 {
Obj1Type obj1_;
public:
MyClass2() {
// Do something
}
MyClass2(Obj1Type const& obj1) {
obj1_ = obj1;
}
// ...
};
И затем в main:
int main() {
MyClass1<4, 3> obj1;
MyClass2<3, 2, MyClass1<4, 3>> obj2(obj1);
obj1.foo(12);
obj2.bar(1);
obj2.zet(5);
}
Проверьте это Live
ОБНОВЛЕНИЕ
Вы также можете использовать наследование и создать простой базовый класс для этого:
class BaseMyClass1 {};
template<int a, int b>
class MyClass1 : public BaseMyClass1 {
// ...
};
template<int m, int n>
class MyClass2 {
BaseMyClass1 obj1_;
public:
MyClass2() {
// Do something
}
template <typename Obj1Type>
MyClass2(Obj1Type const& obj1) {
obj1_ = obj1;
}
// ...
};
И затем в основном:
int main() {
MyClass1<4, 3> obj1;
MyClass2<3, 2> obj2(obj1);
obj1.foo(12);
obj2.bar(1);
obj2.zet(5);
}
Это спасет вас от объявления шаблона в списке параметров шаблона. Тем не менее, это может быть не идеальным решением для вас, потому что оно вводит нарезку объектов.
Проверьте это live