有模板實例化(「兩階段名稱查找」)兩個階段。
在第一階段,所有非從屬名稱都被解析(查找)。在第二階段,依賴名稱被解析。
一個從屬名稱是依賴於模板參數的名稱,例如:
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
}
順便說一句,我曾經寫this-> is not only a matter of style我甚低頻博客。
Joachim Pileborg給你答案。除此之外,所提供的代碼還有其他一些問題妨礙了它的編譯。 – Anonymous 2012-04-16 09:07:44
這是實際的碼?在類定義之後沒有後綴分號,而int B:f()'的作用域運算符不正確,並且在錯誤行處沒有分號。 –
hmjd
2012-04-16 09:07:53
哦,這只是一個打字錯誤。我修好了它。 – 2012-04-16 09:17:07