【问题标题】:no match for call to (class)(type) in constructor构造函数中对(类)(类型)的调用不匹配
【发布时间】: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


【解决方案1】:

您是否尝试构造 Key 对象?你不能在函数体中这样做。

要么在构造函数初始化列表中与其他成员变量一起执行,要么使用赋值:

Key = ByteVector{N};

您现在正在尝试在 Key 对象上使用函数调用运算符,并且由于结构没有这样的运算符,您会收到错误。

【讨论】:

  • 啊,如此简单的修复!谢谢你。时间一到,我会接受这个作为正确答案
猜你喜欢
  • 2020-07-17
  • 2011-12-28
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2018-11-30
  • 2017-07-18
相关资源
最近更新 更多