Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用另一个类模板实例化一个类模板会导致使用不完整的类型_C++_Templates - Fatal编程技术网

C++ 用另一个类模板实例化一个类模板会导致使用不完整的类型

C++ 用另一个类模板实例化一个类模板会导致使用不完整的类型,c++,templates,C++,Templates,比如说,我们有以下类模板: template<size_t S> struct A { char str[S]; }; template<typename T> class B { T t; public: void init(); // Should initialize the 't' member in some a way. }; 由于structA应负责其成员的构造和销毁,因此我建议您执行以下操作: 模板 结构A{ (){ memset(str

比如说,我们有以下类模板:

template<size_t S>
struct A
{
  char str[S];
};

template<typename T>
class B
{
  T t;

public:
  void init(); // Should initialize the 't' member in some a way.
};

由于struct
A
应负责其成员的构造和销毁,因此我建议您执行以下操作:

模板
结构A{
(){
memset(str,0,S);
}
char-str[S];
};
然后你可以有:

模板
void B::init()
{}
更新

正如@NathanOliver所指出的,甚至不需要struct
A
的默认构造函数。以下措施也会奏效:

模板
结构A{
字符str[S]{};
};

而且,由于初始化
char
数组的责任被传递给struct
A
,因此您不需要专门化模板。

由于struct
A
应该负责其成员的构造和销毁,我建议您执行以下操作:

模板
结构A{
(){
memset(str,0,S);
}
char-str[S];
};
然后你可以有:

模板
void B::init()
{}
更新

正如@NathanOliver所指出的,甚至不需要struct
A
的默认构造函数。以下措施也会奏效:

模板
结构A{
字符str[S]{};
};

而且,由于初始化字符数组的责任被传递给了struct
A
,因此您不需要模板专门化。

为了提供部分专门化,它执行特定于
B

的操作来提供部分专门化,执行特定于
B

init
函数是一种反模式。
B
的构造函数应该初始化它的所有成员,理想情况下,它的所有成员都应该是RAII类型,这样默认值就可以正常工作。
init
函数是一种反模式。
B
的构造函数应该初始化它的所有成员,理想情况下,它的所有成员都应该是RAII类型,这样默认值就可以正常工作了。为什么还要有一个空的
init
函数呢?另外,使用
charstr[S]{}a
@NathanOliver中使用默认构造函数,我将
init
函数留空,这样OP就可以在那里放置其他东西了。。。是的,关于不需要的默认ctor,您是对的。我会更新我的答案。TnxI将我的问题的关键放在这里。我知道我可以将初始化移动到
A
。确切地说,在我的项目中,
B
模板更复杂,它的
T
参数应该是一个POD结构。为什么还要有一个空的
init
函数?另外,使用
charstr[S]{}a
@NathanOliver中使用默认构造函数,我将
init
函数留空,这样OP就可以在那里放置其他东西了。。。是的,关于不需要的默认ctor,您是对的。我会更新我的答案。TnxI将我的问题的关键放在这里。我知道我可以将初始化移动到
A
。确切地说,在我的项目中,
B
模板更复杂,它的
T
参数应该是POD结构。
template<>
void B<A<S>>::init()
{
  // Initialize the 't.str'. For example:
  memset(t.str, 0, S);
}
#include <cstddef>
#include <cstring>
#include <iostream>

template<std::size_t S>
struct A
{
  char str[S];
};

template<typename T>
class B
{
  T t;

public:
  void init(); // Should initialize the 't' member in some a way.
};

template<std::size_t S>
class B<A<S>> {
  using T = A<S>;

  T t;

public:
  void init(); // Should initialize the 't' member in some a way.
};

template<std::size_t S>
void B<A<S>>::init()
{
  // Initialize the 't.str'. For example:
  std::memset(t.str, 0, S);
  std::cout << "Initialized B<A<" << S << ">>\n";
}

int main() {
    B<A<3>> b;
    b.init();
}