模块类<class_name>的问题,其中bitset为参数</class_name>

时间:2011-07-26 10:49:28

标签: c++ objective-c++

我想用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工作时。可能是因为编译器自动完成了我需要做的事情。那我需要做什么呢。

3 个答案:

答案 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的大小,对吗?

使用另一个位集实现是一种选择。