不知道为什么我得到关于std :: size_t不包含参数包的编译错误

时间:2017-02-04 17:18:21

标签: c++ variadic-templates variadic-functions

我在这里上课:

Double

我收到此编译错误:

template<typename ClassType, std::size_t... Dims>
class MatrixCell {
private:
    std::vector<std::size_t> coordinateIndices_;
    ClassType data_;

public:
    MatrixCell() : coordinateIndices_{Dims...} {}

    //template<typename ClassType, std::size_t... Dims>
    void addItem( ClassType item, std::size_t... Dims) {
        if ( !checkIndex( Dims... ) ) {
            std::ostringstream strStream;
            strStream << __FUNCTION__ << " current index doesn't exist.";
            Logger::log( strStream, Logger::TYPE_ERROR );
            throw ExceptionHandler( strStream );
        } else {
            data_ = item;
        }
    }

private:
    //template<typename ClassType, std::size_t... Dims>
    bool checkIndex( std::size_t... Dims ) {
        return true;
    }
};

我没有理解错误代码的问题;我在理解导致错误的确切原因时遇到了问题,并且在我尝试过很多事情的地方不确定要纠正错误的语法是什么。

我有一个类似的类,编译就好了:

1>------ Build started: Project: FileTester, Configuration: Debug Win32 ------
1>  Matrix.cpp
1>c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(155): error C3543: 'std::size_t': does not contain a parameter pack
1>  c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(171): note: see reference to class template instantiation 'MatrixCell<ClassType,Dims...>' being compiled
1>c:\users\skilz80\documents\visual studio 2015\projects\filetester\filetester\matrix.h(168): error C3543: 'std::size_t': does not contain a parameter pack
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
};

因此,正确方向的指针非常有用,非常感谢。

1 个答案:

答案 0 :(得分:4)

你可能想要这个:

void addItem( ClassType item, decltype(Dims)... dims ) {
    if ( !checkIndex( dims... ) ) {

bool checkIndex( decltype(Dims)... dims ) {

不幸的是VC ++无法编译它。它可能是一个编译器缺陷(不太确定,因为我没有尝试根据标准验证这一点,但g ++和clang都编译它)。幸运的是,我们可以解决它。我们真的不需要decltype,我们需要一些std::size_t常量表达式,忽略它并返回std::size_t。类似于常量类型级函数的东西。例如:

template <std::size_t>
struct const_size_t
{
    using type = std::size_t;
};

并像这样使用它:

void addItem( ClassType item, typename const_size_t<Dims>::type... dims) 

Live demo