将位设置为参数的模板类出现问题 我想用C++编写一个类,其中一个参数是位集。 我想为该类的任何对象提供改变该大小的功能,但对于该对象应该是常量

将位设置为参数的模板类出现问题 我想用C++编写一个类,其中一个参数是位集。 我想为该类的任何对象提供改变该大小的功能,但对于该对象应该是常量,c++,objective-c++,C++,Objective C++,如果我做一个变量const int size;并在构造函数中初始化它,然后它不会编译,因为写入位集需要大小为静态,这将使类的所有对象的大小相同 除了制作类模板并将大小作为类名传递外,还有其他方法吗 谢谢,但是。。但这使得这个Foo类对象无论何时用作组合对象作为数据成员。。。是否有必要再次制作该类模板。我创建了一个类,并将define BIT_SIZE 16传递给Foo bits;它给编译错误未定义的Foo::Foo引用。其中Foo是构造函数。我认为它应该工作,因为这也是编译时。我只想做一些小尺寸

如果我做一个变量const int size;并在构造函数中初始化它,然后它不会编译,因为写入位集需要大小为静态,这将使类的所有对象的大小相同

除了制作类模板并将大小作为类名传递外,还有其他方法吗

谢谢,但是。。但这使得这个Foo类对象无论何时用作组合对象作为数据成员。。。是否有必要再次制作该类模板。我创建了一个类,并将define BIT_SIZE 16传递给Foo bits;它给编译错误未定义的Foo::Foo引用。其中Foo是构造函数。我认为它应该工作,因为这也是编译时。我只想做一些小尺寸的东西。我应该制作我的下一级课程模板吗??这些错误可能是由于其他错误造成的。但我一次又一次地检查


是的,先生,我已经实现了,但是包括了头文件而不是cpp文件。。。。。。。。。。当我将这些更改为cpp文件时。。。出现多个声明错误。我正在linux ubuntu上工作。。当我把这些文件带到windows中的dev_cpp时,它起了作用。可能是因为编译器自动完成了我需要做的事情。那么我需要做什么。

要使用位集成员,必须将大小设置为模板参数,并在成员中使用该参数:

template <size_t N>
class Foo
{
  std::bitset<N> thebitset;

public:
  Foo() /* ... */
};
然后使用它,说Foo 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]; }
};
要使用位集成员,必须将“大小”设置为模板参数,并在成员中使用该参数:

template <size_t N>
class Foo
{
  std::bitset<N> thebitset;

public:
  Foo() /* ... */
};
然后使用它,说Foo 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]; }
};

模板参数应为编译时常量;编译器将为不同的大小参数生成不同的类。如果要对各种可能的大小使用单个位集类,请使用例如Boost dynamic_位集:


并将位集大小作为构造函数参数传递

模板参数应为编译时常量;编译器将为不同的大小参数生成不同的类。如果要对各种可能的大小使用单个位集类,请使用例如Boost dynamic_位集:


并将位集大小作为构造函数参数传递

否,没有其他方法,因为位集的实际实例化代码是在编译时生成的,因此您不可能将其大小延迟到运行时提供。必须使用非类型模板参数

如果可能的话,标准C++库的创建者会这样做,并且可以在运行时提供BIT集的大小,对吗?


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

不,没有其他方法,因为位集的实际实例化代码是在编译时生成的,因此您不可能将其大小延迟到运行时提供。必须使用非类型模板参数

如果可能的话,标准C++库的创建者会这样做,并且可以在运行时提供BIT集的大小,对吗?


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

谢谢,但是。。使用它是可以的。但这使得这个Foo类对象无论何时用作组合对象作为数据成员。。。是否有必要再次制作该类模板。我创建了一个类,并将define BIT_SIZE 16传递给Foo bits;它给编译错误未定义的Foo::Foo引用。其中Foo是构造函数。我认为它应该工作,因为这也是编译时。我只想做一些小尺寸的东西。我应该制作我的下一级课程模板吗??这些错误可能是由于其他错误造成的。但我检查了一下,我甚至在Fooundefined引用中为BITS_SIZE指定了默认值,这不是编译时错误,而是链接器错误。你实现了构造器吗?是的,先生,我已经实现了,但是包括了头文件而不是cpp文件。。。。。。。。。。当我将这些更改为cpp文件时。。。出现多个声明错误。我正在linux ubuntu上工作。。当我把这些文件带到windows中的dev_cpp时,它起了作用。可能是因为编译器自动完成了我需要做的事情。那我需要做什么呢谢谢但是。。使用它是可以的。但这使得这个Foo类对象无论何时用作组合对象作为数据成员。。。是否有必要再次制作该类模板。我创建了一个类,并将define BIT_SIZE 16传递给Foo bits;它给编译错误未定义的Foo::Foo引用。其中Foo是构造函数。我认为它应该会起作用,因为这也是一个问题
时间我只想做一些小尺寸的东西。我应该制作我的下一级课程模板吗??这些错误可能是由于其他错误造成的。但我检查了一下,我甚至在Fooundefined引用中为BITS_SIZE指定了默认值,这不是编译时错误,而是链接器错误。你实现了构造器吗?是的,先生,我已经实现了,但是包括了头文件而不是cpp文件。。。。。。。。。。当我将这些更改为cpp文件时。。。出现多个声明错误。我正在linux ubuntu上工作。。当我把这些文件带到windows中的dev_cpp时,它起了作用。可能是因为编译器自动完成了我需要做的事情。那么我需要做什么呢?你的问题中的对话是什么?你在回答谁?你的问题中的对话是什么?你在回答谁?