C ++类模板继承之谜

时间:2011-10-31 18:52:57

标签: c++ templates compiler-errors

这段代码有什么问题? gcc 4.6.1抱怨“boo()中未在此范围内声明''foo'”。如果我转换代码以使其中一个模板只是一个常规类,那么问题就会消失。

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 个答案:

答案 0 :(得分:1)

有什么问题,根据规范,我不知道,但您可以使用以下代码编译代码:

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

答案 1 :(得分:1)

foo是一个从属名称;也就是说,它取决于模板参数,因此在实例化模板之前,编译器不知道它是什么。您必须明确表明它是一个类成员,Bar<N>::foothis->foo

(你可能也想用它做一些事情;只是使用它作为表达式的忽略值根本不做任何事情。)