我正在尝试定义一个非类型模板类构造函数,但是当我调用该类的struct成员的构造函数时它给出了以下错误:
error: no match for call to ‘(ByteVector) (unsigned int)’
Key(N);
^~~
这是AES构造函数,它也是违规代码:
template <unsigned int N>
AES<N>::AES(Mode mode) : IV(BLOCKSIZE), Block(BLOCKSIZE), SubKey(BLOCKSIZE), mode(mode)
{
try
{
if(N == 256 || N == 192 || N == 128)
{
Key(N);
switch(N)
{
case 256: RoundNum = 14; break;
case 192: RoundNum = 12; break;
case 128: RoundNum = 10; break;
default: break; // This should never be reached
}
}
else
throw "Size Error in AES constructor. Valid sizes: 256, 192, 128";
} catch (char const *e)
{
std::cerr << e << std::endl;
exit(1);
}
}
ByteVector是一个简单的结构,它传递一个unsigned int,用于初始化大小:
ByteVector::ByteVector(unsigned int s)
{
size = s / 8;
for(int i = 0; i < s; i++) data.push_back(0);
}
以下是精简的类定义:
typedef uint8_t Byte;
typedef struct ByteVector
{
std::vector<Byte> data;
int size;
ByteVector();
ByteVector(unsigned int size);
} ByteVector;
template <unsigned int N>
class AES
{
public:
AES();
AES(Mode mode);
protected:
ByteVector IV;
ByteVector Block;
ByteVector Key;
ByteVector SubKey;
Mode mode;
uint8_t RoundNum;
};
AES方法在.tcc文件中定义,该文件包含在AES.hh文件中的类定义下面
如果你把Key(N)放在AES构造函数的初始化列表中,它不会抱怨,但因为我正在检查N的大小,我认为它不应该进入初始化列表。
但是,如果将初始化列表中的调用放入AES构造函数的主体中,它也会为它们提出问题。
感谢任何帮助,谢谢。
答案 0 :(得分:1)
您是否正在尝试构建 Key
对象?你不能在函数体中这样做。
要么在构造函数初始值设定项列表中与其他成员变量一起使用,要么使用赋值:
Key = ByteVector{N};
您现在正在尝试在Key
对象上使用函数调用运算符,并且由于结构没有这样的运算符,您会收到错误。