我想用C ++编写一个类,其中一个参数是bitset<size>
。
我想让设施为该类的任何对象改变这个“大小”,但对于该对象应该是恒定的。
如果我创建一个变量const int size;
并在构造函数中初始化它,那么它就不会编译,因为写bitset<size>
需要size
是静态的,这会使所有变量都相同班级的对象。
除了制作类模板并将大小传递为classname<size>
之外,还有其他方法吗?
谢谢但是..但是这个Foo类对象只要用作组合(对象作为数据成员)......是否有必要再次制作该类模板。我创建了一个类并传递了一个(#define BIT_SIZE 16到Foo位;)它给出了编译错误未定义引用Foo&lt; 16&gt; :: Foo()。其中Foo()是构造函数。我认为它应该工作,因为这也是编译时间。我只想制作BIT_SIZE位大小。我应该制作我的“下一级”课程模板吗?这些错误可能是由于其他错误造成的。但我一次又一次检查。
是的先生我已经实现了,但包括头文件而不是cpp文件..........当我将这些更改为cpp文件时...多个声明错误来了。我正在使用linux ubuntu ..当我把这些文件带到dev_cpp中的Windows工作时。可能是因为编译器自动完成了我需要做的事情。那我需要做什么呢。
答案 0 :(得分:2)
模板参数应该是编译时间常量;编译器将为不同的大小参数生成不同的类。如果你想为各种可能的大小使用单个bitset类,那么使用,例如,Boost dynamic_bitset:
http://www.boost.org/doc/libs/1_47_0/libs/dynamic_bitset/dynamic_bitset.html
并将bitset大小作为构造函数参数传递
答案 1 :(得分:1)
要使用bitset
成员,您必须使size
成为模板参数并在成员中使用该参数:
template <size_t N>
class Foo
{
std::bitset<N> thebitset;
public:
Foo() /* ... */
};
然后使用它,说Foo<12> x;
。
鉴于您对替代方案的疑问,您可以使用运行时动态数组而不是静态数组:
class Bar
{
std::vector<unsigned char> thedata;
public:
explicit Bar(size_t n) : thedata(n, 0) { }
inline unsigned char & operator[](size_t i) { return thedata[i]; }
inline const unsigned char & operator[](size_t i) const { return thedata[i]; }
};
答案 2 :(得分:1)
不,没有其他方法,因为bitset<N>
的实际实例化代码是在编译时生成的,因此在运行时之前不可能延迟提供其大小。您必须使用非类型模板参数。
如果有可能,标准C ++库的创建者就会这样做,并且可以在运行时提供bitset
的大小,对吗?
使用另一个位集实现是一种选择。