![](/img/trans.png)
[英]Why can't I use std::unique_ptr as a “template<class> class” argument?
[英]Why can't I use variable of parent class that is template class?
啊
template <typename T>
class A
{
public:
int a;
}
BH
template <typename T>
class B : public A<T>
{
public:
int f();
}
template <typename T>
int B<T>::f()
{
int t;
t = this->a; //Okay
t = a //Error
return 0;
}
為什么我不使用this->
時會發生錯誤 - this->
?
我可以使用某種方法省略this->
嗎?
(我修正了一些錯誤)
模板實例化有兩個階段(“兩階段名稱查找”)。
在第一階段,解析所有非依賴名稱(查找)。 在第二階段,依賴名稱被解析。
從屬名稱是依賴於模板參數的名稱,例如:
template <typename T>
void foo() {
x = 0; // <- Non-dependent, nothing in that refers to "T".
// Thus looked up in phase 1, therefore, an 'x' must be
// visible.
T::x = 0; // <- Dependent, because it depends on "T".
// Looked up in phase 2, which is when it must be visible.
}
現在,你寫道:
t = this->a; //Okay
t = a //Error
這正是我所描述的。 在好的術語中,在階段2中查找t
,因為this
取決於模板參數。
在階段1中查找錯誤的術語,因為該名稱中的任何內容都不依賴於模板參數。 但是在階段1中,沒有a
是可見的,因為編譯器無法在階段1中內省基類模板,因為模板可以是專用的,並且在實例化時,可以遠離主模板聲明,另一個沒有a
專業化,可能是可見的。
例:
template <typename T>
struct Base {
};
template <typename T>
struct Derived : Base<T> {
void foo() {
this->a = 0; // As is valid. `this->a` is looked up in phase 2.
}
};
template <> struct Base<int> {
int a;
};
int main ()
{
// The following declarations trigger phase 2 lookup.
Derived<int> di; // valid, because a later specialized
// Base<int> is used and all symbols
// are resolved.
Derived<float> df; // not valid
}
順便說一下,我曾經寫過這個 - >不僅僅是我的低頻博客中的風格問題 。
B
是一個模板,因此它的名稱是非依賴的,因此必須在定義模板時查找,而不是在實例化時。 但是,在定義模板時,依賴名稱是未知的(可能存在到目前為止尚未看到的基類模板A
),編譯器無法將非限定名稱解析為基類。 您可以通過this->
qualified將名稱帶入當前作用域,方法是在其前面添加A<T>::
或使用using
聲明:
template <typename T>
class B : public A<T>
{
public:
using A<T>::a;
int f();
};
另請注意,在類聲明之后缺少分號以及標有// Error
注釋的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.