سلام.
من برای یه قسمتی از کدم بایستی چندتا تابع بنویسم که مربوط به کار با چند جمله ای هاست.
یکی از این توابع قراره درجه چند جمله ای رو زیاد کنه.مثلا در جه 2 بهش بدیم و بگیم درجه رو 3 تا زیاد کن.این تابع اونقدری صفر پشت این این چند جمله ای بذاره که هم سایز یه چند جمله ای درجه 5 بشه.
برای محاسبات ماتریسی از کتابخانه armadillo استفاده میکنم و کد زیر رو نوشتم که متاسفانه چون زیاد به template ها مسلط نیستم نمیدونم ایرادش کجاست که ارور میده.
template<typename T>
auto shiftPolynomial(const Col<T>& input, const int& howMuch,
const VectorType& WhichType) ->Col<T> {
Col<T> result(input.n_elem + howMuch);
if (WhichType == VectorType::ComplexType) {
if (howMuch > 0) {
vector<complex<double>> tmp(input.n_elem + howMuch);
for (size_t index = 0; index < howMuch; index++) {
tmp[index] = 0.0;
}
for (size_t index = howMuch; index < tmp.size(); index++) {
tmp[index] = input(index - howMuch);
}
copy_n(tmp.begin(),tmp.size(),result.begin());
} else {
return input;
}
} else if (WhichType == VectorType::OrdinaryType) {
if (howMuch > 0) {
vector<double> tmp(input.n_elem + howMuch);
for (size_t index = 0; index < howMuch; index++) {
tmp[index] = 0.0;
}
for (size_t index = howMuch; index < tmp.size(); index++) {
tmp[index] = input(index - howMuch);
}
copy_n(tmp.begin(),tmp.size(),result.begin());
} else {
return input;
}
}
return result;
}
int main() {
cx_vec N { { 1, 2 }, { 3, 4 } };
vec D{1,2,3};
cout << shiftPolynomial(D,3,VectorType::OrdinaryType) << endl;
return 0;
}
ایرادش اینجاست که بسته به نوعی که با enum براش مشخص میکنم بایستی فقط همون قسمت از تابع رو انجام بده ولی ظاهرا به قسمتهای دیگه if هم میره و اینجا عدم تطابق پیش میاد بین نوعی که باید باشه و قسمتی که الان برنامه توشه.
ارور توی copy_n رخ میده و میگه که نمیتونه نوع complex رو به double تبدیل کنه.
آیا قوانین خاصی دارند این template ها؟
ممنون میشم راهنماییم کنید.
با تشکر