繁体   English   中英

在模板中使用不完整的模板类型

[英]Use of incomplete template types in templates

这是我几周前提出的一个问题的后续,该问题的答案是,在模板中使用仅在模板实例化时才完整而不是在它的定义时间。

我的后续问题是,在不完整类型本身依赖于模板参数的情况下,这仍然适用吗? 因为它似乎不是。 以下在 Godbolt 上的所有编译器中编译,即使foo::do_stuff()使用foo_wrapper::value()仅给出 class 模板foo_wrapper最终存在的前向声明。

#include <iostream>

template<typename T>
class foo_wrapper;

template<typename T>
class foo {
    foo_wrapper<T>& parent_;
public:
    foo(foo_wrapper<T>& wrapped) : parent_(wrapped)
    {}

    void do_stuff() {
        std::cout << "do stuff " << parent_.value() << "\n";
    }
};

template<typename T>
class foo_wrapper {
    foo<T> foo_;
    T value_;
public:

    foo_wrapper(T n) :
        foo_(*this),
        value_(n)
    {}

    void do_stuff() {
        foo_.do_stuff();
    }

    T value() const {
        return value_;
    }

};

int main()
{
    foo_wrapper<int> fw(42);
    fw.do_stuff();
}

这是合法的。

经验法则是在模板实例化时检查依赖于模板参数的所有内容。 其他所有内容要么在第一次看到模板时检查,要么在实例化时检查(例如,MSVC 倾向于检查所有内容较晚,而 Clang 倾向于尽早检查)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM