当我有多个参数并且其中一些是非泛型
时,我对模板特化有所了解我有一个叫做Polinom(多项式)的类,它基本上是一个T对象数组,其大小在模板定义中声明(作为int)。我还有一个名为Complex的类。现在我想要的是创建一个模板专门化,这样当我有一个复杂为T的polinomial时,我将调用不同的函数(重载的运算符函数)。我的问题是我怎么能这样做,我收到一个错误"类型名称不允许,stepen undefined"在尝试创建专业化时,如果有人能够清理这里发生的事情会很棒。
#pragma once
#include <iostream>
#include <cmath>
using namespace std;
template<class T, int stepen>
class Polinom
{
private:
T koeficijenti[stepen];
public:
Polinom() {};
~Polinom() {};
void ucitajKoef();
T vrednost(T x);
};
template<>
class Polinom<Complex, int stepen> //error type name not allowed
{
};
template<class T, int stepen>
T Polinom<T, stepen>::vrednost(T x)
{
T suma = koeficijenti[1] * (T)pow(x, stepen);
for (int i = 1; i < stepen; i++)
{
suma += koeficijenti[i] * pow(x, stepen - i);
}
return suma;
}
template<class T, int stepen>
void Polinom<T, stepen>::ucitajKoef()
{
T uneseniKoef;
for (int i = 0; i < stepen; i++)
{
cout << "Unesite koeficijent" << endl;
cin >> uneseniKoef;
koeficijenti[i] = uneseniKoef;
}
}
P.S。是否有一个解决方法,必须重写该类的所有其他函数,因为我只专注,所以我可以重载函数vrednost(值)
答案 0 :(得分:0)
专业化应该如下:
#include <iostream>
template <typename T, int N>
struct Array {
T var[N];
T sum() {
T res{};
for (T v:var) {
res += v;
}
return res;
}
};
struct Complex {};
template <int N>
struct Array<Complex, N> {
Complex var[N];
Complex sum() {
std::cout <<"Complex sum called\n";
return {};
}
};
int main()
{
Array<Complex,5> array;
array.sum();
}
请注意,这是一个最小的(我认为),完整且可验证的示例。如果你在提出问题时花时间创造类似的东西,你会得到更好的答案。
回答你的问题:我知道没有办法简单地专门化模板中的一个函数 - 这就是为什么你会得到复杂的东西,比如CRTP和从成员调用的各个函数(可以单独专门化)