Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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,考虑简单的代码: struct x; template<typename> void func(){} int main() { func<x>(); return 0; } structx; 模板void func(){} int main(){ func(); 返回0; } 上述代码不要求类x完整,是否有其他情况不要求类x完整。通常情况下,哪些情况需要模板参数完成?需要x完成是指需要知道x在内存中的布局。例如: struct x; templat

考虑简单的代码:

struct x;
template<typename> void func(){}

int main() {
    func<x>();
    return 0;
}
structx;
模板void func(){}
int main(){
func();
返回0;
}

上述代码不要求类
x
完整,是否有其他情况不要求类
x
完整。通常情况下,哪些情况需要模板参数完成?

需要
x
完成是指需要知道
x
在内存中的布局。例如:

struct x;
template<typename> void func() {
    // Compiler error: what is x::foo ???
    std::cout << x.foo() << std::endl;
}
int main() {
    func<x>();
    return 0;
}
structx;
模板void func(){
//编译器错误:什么是x::foo???

std::cout与其他地方一样:如果

  • 您只使用指向该类型的指针
  • 或参考资料
  • 或者将其用作声明中的参数

不使用指针/引用访问成员。

如果某些模板实例化导致生成要求类型完整的代码,则模板参数必须是完整类型,例如,任何需要模板参数大小的构造、使用成员访问等

在您的情况下,根本不使用模板参数。任何实例化都不需要完成类型。我们很容易导致错误:

struct x;

template<typename T> void func()
{ T a; } //requires complete type

int main() {
    func<x>();
}
structx;
模板void func()
{T a;}//需要完整的类型
int main(){
func();
}
GCC表示:

错误:“x a”的类型不完整

如果使用指针或引用,则不需要完整的类型:

template<typename T> void func()
{ T* a; } //does not need complete type
template void func()
{T*a;}//不需要完整类型
请注意,类型需要在实例化时完成。这意味着,只要您在模板中的使用和该模板的实例化之间定义了结构,就可以了。这将干净地编译:

struct x;

template<typename T> void func()
{ T a; } //requires complete type

struct x{}; //we now define x

int main() {
    func<x>(); //instantiation
}
structx;
模板void func()
{T a;}//需要完整的类型
struct x{};//我们现在定义x
int main(){
func();//实例化
}

请注意,模板类的成员函数仅在使用时才会实例化。因此,只要不使用这些成员函数,就可以使用具有需要完整类型和不完整模板参数的成员函数的模板类

例如,使用此代码:

struct x;

template <typename T>
struct Foo {
    void bar() {
    }

    void baz() {
        T a;   
    }
};
structx;
模板
结构Foo{
空条(){
}
void baz(){
Tα;
}
};
这是有效的:

Foo<x> a;
a.bar();
fooa;
a、 bar();
但这不是:

Foo<x> a;
a.baz(); //requires complete type
fooa;
a、 baz();//需要完整的类型

澄清:如果在
func()
定义和
main()
函数之间定义了
struct x
,则此操作有效。