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所指出的,甚至不需要structA
的默认构造函数。以下措施也会奏效:
模板
结构A{
字符str[S]{};
};
而且,由于初始化
char
数组的责任被传递给structA
,因此您不需要专门化模板。由于structA
应该负责其成员的构造和销毁,我建议您执行以下操作:
模板
结构A{
(){
memset(str,0,S);
}
char-str[S];
};
然后你可以有:
模板
void B::init()
{}
更新
正如@NathanOliver所指出的,甚至不需要structA
的默认构造函数。以下措施也会奏效:
模板
结构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();
}