2011-02-07 2 views
7

Возможные Дубликаты:
[FAQ]Why doesn't a derived template class have access to a base template class' identifiers? Problem with protected fields in base class in c++
cannot access data member in a class templateC++ класс шаблона и наследование

После кода дает мне ошибку компиляции. Что не так?

struct Base { 
    int amount; 
}; 

template<class T> struct D1 : public Base { 
}; 

template<class T> 
struct D2 : D1<T> { 
    void foo() { amount=amount*2; /* I am trying to access base class data member */ }; 
}; 

int main() { 
    D2<int> data; 
}; 


test.cpp: In member function 'void D2<T>::foo()': 
test.cpp:11: error: 'amount' was not declared in this scope 

Как исправить это?

благодаря

+0

Я видел этот вопрос несколько раз раньше, но я не могу найти ссылку. –

+0

Найден один, хотя, если кто-то может найти один с лучшим вопросом, который будет большим: [Проблема с защищенными полями в базовом классе в C++] (http://stackoverflow.com/questions/1813671/problem-with-protected- fields-in-base-class-in-c) –

+2

@Chris: Здесь [дубликат] (http://stackoverflow.com/questions/4210108/cannot-access-data-member-in-a-class-template) , и вот [длинное объяснение] (http://stackoverflow.com/questions/4643074/why-do-i-have-to-access-template-base-class-members-through-the-this-pointer). – GManNickG

ответ

8

Проблема связана с тем, как имена ищутся в шаблонных классов, которые наследуют от шаблона базовых классов. Фактические правила, стоящие за ним, довольно загадочны, и я не знаю их с головы; Обычно мне приходится проконсультироваться со ссылкой, чтобы точно узнать, почему это не работает.

Путь исправить это явно префикс члена вы обращаетесь с this->:

void foo() { 
    this->amount = this->amount * 2; // Or: this->amount *= 2; 
} 

Это дает компилятору однозначный намек о том, где имя amount приходит и должен устранить ошибку компилятора.

Если кто-то хочет дать более подробное описание причины возникновения этой ошибки, я хотел бы получить хорошее объяснение.

+1

Причина ошибки заключается в том, что компилятор не делает никаких предположений о членах базового класса шаблона в случае частичной специализации базового класса, который не включает некоторые из этих элементов. – Gorpik

+0

Спасибо. Оно работает! – anon

+0

Согласно [this] (http://www.hackcraft.net/cpp/templateInheritance/): «Интересная вещь, касающаяся базы , заключается в том, что ни одна из ее функций-членов не создается до тех пор, пока не появится тип T». Поэтому компилятор может не знать во время определения о каком-либо из членов, а не только о функциях. – jswolf19

Смежные вопросы