Головоломка наследования шаблонов класса C ++ - PullRequest
0 голосов
/ 31 октября 2011

Что не так с этим кодом?gcc 4.6.1 жалуется на то, что «foo» не был объявлен в этой области »в baz ().Если я преобразую код так, чтобы один из шаблонов был просто обычным классом, проблема исчезла.

struct Foo {
    char foo;
};

template<int N>
struct Bar : public Foo
{
    Bar() { foo; }
};

template<int N>
struct Baz : public Bar<N>
{
    void baz() { foo; }
};

int main() {
    Baz<10> f;
    return 0;
}

Ответы [ 2 ]

1 голос
/ 31 октября 2011

foo является зависимым именем;то есть, это зависит от параметра шаблона, поэтому, пока шаблон не будет создан, компилятор не будет знать, что это такое.Вы должны четко дать понять, что это член класса, либо Bar<N>::foo, либо this->foo.

(Возможно, вы также захотите что-то с этим сделать; просто используйте его как игнорируемое значение выражениявообще ничего не делать).

1 голос
/ 31 октября 2011

Что не так, согласно спецификациям, я не знаю, но вы можете сделать свой код для компиляции, используя:

void baz() { Bar<N>::foo; }
...