我有几千行代码试图进行重构,并且可以通过将多个不同的类组合到一个通过调用指向外部朋友类的指针来处理事情的类中来减少大量的代码重复。
我遇到了一个问题,因为我有一个变量num_var
,该变量计算要在计算中使用的多个变量,并且该变量根据外部朋友类而变化。这个数字确定了我许多阵列的大小。对于数组,我经常使用外部函数执行线性代数,这些函数是模板函数,其中模板参数为数组的大小num_var
。我曾经有这个static
,但是我再也做不到。
我现在收到这样的错误:
candidate template ignored: invalid explicitly-specified argument for template parameter
下面是一个非常简单的程序,它为更简单的系统重复了编译器错误:
#include <iostream>
enum Color {red=0, blue, green};
class Side {//the side of a shape, which can be a color
public:
Color color;
friend class Shape;
};
//this function adds numerical value of side colors and prints a value
template <size_t N> int sideNamer(Side sides[N]){
int count = 0;
for(int i=0; i<N; i++) count += sides[i].color;
std::cout << "My sides add to " << count << "\n";
return count;
};
class Shape { //can have an arbitrary number of sides, each a different color
public:
const int Nsides;
Side *sides;
//constructor sets the number of sides and gives a color to each side
Shape(int N, Color *colors) : Nsides(N){
sides = new Side[Nsides];
for(int i=0; i<Nsides; i++) sides[i].color = colors[i];
};
~Shape(){ delete[] sides;};
//name the sum of the sides
void nameMySides(){
sideNamer<Nsides>(sides);
}
};
int main(){
//make a triangle: should add to 3
Color myTriangleColors[3] = {red, blue, green};
Shape myTriangle(3, myTriangleColors);
myTriangle.nameMySides();
//make a square: should add to 2
Color mySquareColors[4] = {red, red, blue, blue};
Shape mySquare(4, mySquareColors);
mySquare.nameMySides();
}
这给我同样的错误,关于模板参数的显式指定的参数无效。
当我将Shape
的声明更改为模板类时,>
,那么就没有问题,并且可以正常工作。遗憾的是,我无法在实际程序中执行此操作,因为在代码的其他位置,我还有另一个类持有指向“template <size_t N> class Shape { public: static const int Nsides = N; Side *sides; Shape(Color *colors) { sides = new Side[Nsides]; for(int i=0; i<Nsides; i++) sides[i].color = colors[i]; }; ~Shape(){ delete[] sides;}; void nameMySides(){ sideNamer<Nsides>(sides); } };
和mutando mutandis
Shape
”对象的指针数组,并且无法在以下位置指定`size_t'代码中的那一点,所以我不能在那里使用模板。还有其他方法可以使模板功能正常工作吗?另外,如果可以允许我将Side
数组声明为Side sides[Nsides]
而不是Side *sides
,也将不胜感激。]
当我不能使用模板类或
static const
时如何使用模板参数?还是有办法使模板类在程序的早期工作?我是否只需要重写线性代数函数?提前感谢。
(PS我存在问题的实际类称为Mode
,代表物理问题中的本征模。它具有一个称为ModeDriver
的抽象类的指针,并且ModeDriver
的各个子代可能有2、4, 8,...变量,其数量存储在名为num_var
的变量中。此变量根据要建模的特定波形的物理属性而变化。代码中的几个不同位置使用线性代数函数。)] >
我要重构的几千行代码,并且可以通过将多个不同的类组合到一个可以通过...处理事情的类中来减少大量的代码重复。 [
const int Nsides;
是模板实例化的有效参数。这就是编译器试图告诉您的信息,并且确切地说明了您对该模板本身所做的更改是否可以修复。