在构造函数中调用(类)(类型)不匹配

时间:2017-04-11 06:52:20

标签: c++ class templates struct constructor

我正在尝试定义一个非类型模板类构造函数,但是当我调用该类的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构造函数的主体中,它也会为它们提出问题。

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

Key = ByteVector{N};

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