我想使用boost::array作为类成员,但我不知道编译时的大小。我想到了这样的东西,但它不起作用:
int main() {
boost::array<int, 4> array = {{1,2,3,4}};
MyClass obj(array);
}
class MyClass {
private:
boost::array<int, std::size_t> array;
public:
template<std::size_t N> MyClass(boost::array<int, N> array)
: array(array) {};
};
编译人员,gcc,说:
error: type/value mismatch at argument 2 in template parameter list for
‘template<class _Tp, long unsigned int _Nm> struct boost::array’
error: expected a constant of type ‘long unsigned int’, got ‘size_t’
这显然意味着不能将可变大小的数组用作类成员。如果是这样,这将否定boost::array相对于向量或标准数组的所有优势。
你能告诉我我哪里做错了吗?
发布于 2010-01-09 09:35:58
不,boost::array (它在TR1中作为std::tr1::array)是一个静态大小的缓冲区。该类的要点是避免动态内存分配--您可以将一个boost::array完全放在堆栈上。
您可以让您的示例类接受一个模板int并将其传递给boost::array成员,
template<int Size>
class MyClass
{
private:
boost::array<int, Size> m_array;
public:
// ....
};
但这只是装饰品,它仍然是一个静态分配。
发布于 2010-01-09 09:33:51
你对这个错误的看法是错误的:
template<unsigned long N> MyClass(boost::array<int, N> array) : array(array) {};
应该行得通。顺便说一句,这仍然会在编译时生成数组,所以这不是一个好的解决方案。和其他错误将会发生。
这里您需要的是一个向量,它有一个保留的大小和一些将容量保持在固定大小的断言。
发布于 2013-09-02 21:38:17
如果不需要动态调整大小,则不需要std::vector
只需让函数接受*int
MyFunction (int* array,int size); // function prototype
并将boost::array的.data()指针传递给数据...
boost::array<int,4> testArray;
boost::array<int,5> testArray2;
// Calling the function:
MyFunction(testArray.data(),4);
MyFunction(testArray2.data(),5);
关键是.data()人!如果您希望boost数组替换常规数组,这可能是一种方法(不需要使用模板和所有这些)
https://stackoverflow.com/questions/2031940
复制相似问题