【发布时间】:2017-04-11 06:52:19
【问题描述】:
我正在尝试定义一个非类型模板类构造函数,但是当我调用类的结构成员的构造函数时,它给了我以下错误:
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 是一个简单的结构,它传递一个无符号整数,用于初始化大小:
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 构造函数的主体中,它也会抱怨它们的问题。
感谢您的帮助。
【问题讨论】:
-
离题:如果您只允许三个数字而不是大范围的整数,请考虑将整数替换为
enum。 -
有趣,你为什么建议改变?
-
我建议使用编译时技术来避免 switch..break 的东西,这将使您的代码更清晰,并使您能够将 Key 的初始化移动到 ctor-initializers。你想要一个“错误”的数字来生成编译错误,而不是等到运行时
-
部分是为了可读性,但主要是因为编译器可以使用不在枚举中的值轻松捕获实例化。为什么要在运行时测试编译时已知且可解析的东西?
-
你是对的,这样更有意义。我正在将其修改为枚举。感谢您的反馈
标签: c++ class templates struct constructor