C 名稱何時“依賴”?顯然,當它在同一范圍內使用型別定義時,它是不依賴的。但是,當它在此范圍的嵌套范圍中使用型別定義時,它是依賴的。考慮以下示例:
示例 A:
template <typename T>
struct some_struct
{
struct B
{
int b_;
};
T some_member_func();
T a_;
};
template <typename T>
T some_struct<T>::some_member_func()
{
using hello = B;
return a_;
}
.. 編譯得很好。
示例 B(嵌套):
template <typename T>
struct some_struct
{
struct B
{
struct C {
int c_;
};
};
T some_member_func();
T a_;
};
template <typename T>
T some_struct<T>::some_member_func()
{
using hello = B::C;
return a_;
}
..發出以下錯誤:
<source>: In member function 'T some_struct<T>::some_member_func()':
<source>:365:19: error: need 'typename' before 'some_struct<T>::B::C' because 'some_struct<T>::B' is a dependent scope
365 | using hello = B::C;
| ^
| typename
為什么 some_struct::B 是依賴范圍而不是 some_struct (示例 A)?
uj5u.com熱心網友回復:
如果我正確閱讀https://en.cppreference.com/w/cpp/language/dependent_nameB,則兩者B::C都是依賴的。
但B也“指當前的實體化”,這使得它可以在沒有typename. 這似乎是一種奇特的說法,即“是否為型別不受專業化影響”。
您可以專門B制作B::Cnot 型別:
template <>
struct some_struct<int>::B
{
static void C() {}
};
(有趣的是,部分專業化沒有編譯)
但是你不能阻止B通過專業化成為一種型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/448845.html
