c++ - 一般情况下需要模板参数完整的情况是什么?

标签 c++ templates

考虑简单的代码:

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/

相关文章:

c++ - 使用 Ceres 求解器进行 CMake-ing 项目时冲突的 Eigen 依赖项

c++ - 推导类型,当使用成员函数指针作为模板参数时

C++ 使用指向模板对象的指针

c++ - 从成员地址推导结构模板类型

c++ - Opencv从一个矩形物体中确定4条最外面的角线

c++ - 如何更改 VTK CubeAxesActor2D 中轴线的颜色

c++ - std::remove_if 移除的元素到哪里去了?

php - PHP 中的简单网页布局和模板

c++ - 避免虚拟模板

c++ - 异常处理 - 在没有任何处理程序的情况下抛出异常