考虑简单的代码:
struct x;
template<typename> void func(){}
int main() {
func<x>();
return 0;
}
上面这段代码不需要类x
是完整的,有没有其他情况不需要x
是完整的? .另外一般情况下需要模板参数完整的情况是什么?
最佳答案
如果某些模板实例化导致生成需要完整类型的代码,则模板参数必须是完整类型,例如任何需要模板大小的构造、参数、成员访问的使用等。
在你的例子中,根本没有使用模板参数。没有实例化要求类型是完整的。我们很容易导致错误:
struct x;
template<typename T> void func()
{ T a; } //requires complete type
int main() {
func<x>();
}
海湾合作委员会说:
error: 'x a' has incomplete type
如果我们使用指针或引用,则不需要完整的类型:
template<typename T> void func()
{ T* a; } //does not need complete type
请注意,类型需要在实例化时 完成。这意味着只要您在模板中的使用和该模板的实例化之间定义结构,就可以了。这编译干净:
struct x;
template<typename T> void func()
{ T a; } //requires complete type
struct x{}; //we now define x
int main() {
func<x>(); //instantiation
}
请注意,模板类的成员函数仅在使用时实例化。因此,您可以使用一个模板类,该模板类的成员函数需要具有不完整模板参数的完整类型,只要您不使用这些成员函数即可。
例如,使用此代码:
struct x;
template <typename T>
struct Foo {
void bar() {
}
void baz() {
T a;
}
};
这是有效的:
Foo<x> a;
a.bar();
但这不是:
Foo<x> a;
a.baz(); //requires complete type
关于c++ - 一般情况下需要模板参数完整的情况是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34294372/