【发布时间】:2017-06-21 22:40:04
【问题描述】:
我这里有这门课:
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
因此,指向正确方向的指针将非常有用,我们将不胜感激。
【问题讨论】:
-
那么...问题是关于 c++11 还是 c++14?如果您要包含规范的标签,请仅使用一个。
-
@tambre 或者...我正在使用 VS2015,所以它仍然与可变参数模板及其参数包有关...
-
@tambre 修复了它,只是将 c++ 保留为通用
-
如果问题已解决,请更新您的问题或发布您自己的答案,以便帮助遇到类似问题的其他人。
-
不清楚
std::size_t... Dims函数参数是什么意思。Dims是一组常量。MatrixCell的一个实例化是MatrixCell<double, 2, 3, 4>。Dims...将扩展为2,3,4。MatrixCell<double, 2, 3, 4>::addItem应该有什么签名?您的意思是“想要与Dims包中的参数相同数量的std::size_t参数”?
标签: c++ variadic-templates variadic-functions