繁体   English   中英

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

[英]Not sure why I'm getting compilation error about std::size_t not containing a parameter pack

我在这节课:

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 ==========
};

我对错误代码的理解没有问题; 我在理解究竟是什么导致错误的过程中遇到了问题,并且不确定在尝试了很多事情的地方应该使用哪种适当的语法来纠正它。

我有一个类似的类,可以很好地进行编译,如下所示:

// DimensionPack & Helper Struct
struct MatrixDimensionOddOrEven {
    const unsigned int even_or_odd; 
    explicit MatrixDimensionOddOrEven( unsigned int odd_or_even ) : even_or_odd( test( odd_or_even ) ) {}

private:
    const unsigned int test( unsigned int value ) const {
        if ( value == 0 ) {
            std::ostringstream strStream;
            strStream << __FUNCTION__ << "invalid number: " << value << " must be >= 1.";
            Logger::log( strStream, Logger::TYPE_ERROR );
            throw ExceptionHandler( strStream );
        }
        return ( ((value % 2) == 0) ? EVEN : ODD );
    }
}; typedef MatrixDimensionOddOrEven MatDimOddEven;

template <std::size_t... Dims>
class DimensionPack {
public:
    std::vector<std::size_t> dimensions;
    std::vector<unsigned int> even_or_odd;
    const std::size_t total_dimensions = sizeof...(Dims);
    const std::size_t total_elements = countElements();

public:
    DimensionPack() : dimensions{Dims...},
        even_or_odd{ MatrixDimensionOddOrEven{Dims}.even_or_odd...} {
    }

private:
    std::size_t countElements() {
        std::size_t val = 1; // Don't Init to 0 otherwise multiplication won't work here!
        for ( std::size_t n = 0; n < dimensions.size(); n++ ) {
            val *= dimensions.at( n );
        }
        return val;
    }
}; // DimensionPack

因此,朝着正确方向的指针将非常有用,并且将不胜感激。

您可能想要这样:

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) 

现场演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM