這是我幾周前問的一個問題的后續,其中的答案是格式錯誤,不需要診斷,在模板中使用僅在模板實體化時完成但在實體化時不完整的型別其定義的時間。
我的后續問題是,在不完整型別本身依賴于模板引數的情況下,這仍然成立嗎?因為它似乎不是。以下編譯器在 Godbolt 上的所有編譯器中編譯,即使foo::do_stuff()使用foo_wrapper::value()只給出一個類模板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();
}
uj5u.com熱心網友回復:
這是合法的。
經驗法則是在實體化模板時檢查依賴于模板引數的所有內容。其他所有內容要么在第一次看到模板時檢查,要么在實體化時進行檢查(例如,MSVC 往往會晚檢查所有內容,而 Clang 往往會盡早進行檢查)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/397263.html
下一篇:如何決議轉發參考的回傳型別?
