0

I have this code that uses a template parent class A that has one templated sub-class C. A takes a type (T) and C takes an object of that type (T t) in their template parameters. What I'm trying to do is, in the inheritance of the class B, give C its template arguments, make a b object, and call C's .h member function. But I'm getting the following errors:

prog.cpp:10:44: error: too many template-parameter-lists
prog.cpp: In function 'int main()':
prog.cpp:14:5: error: 'B' was not declared in this scope
prog.cpp:14:7: error: expected ';' before 'b'

template <typename T> struct A {
    protected:
        template <T> struct C { 
            T h( T t ) { return t * t; }
        };
};

template <typename T = int> template <T t = 5> struct B : public A<T>::C<t> {};

int main() {

    B b;
    b.h();

}

The error is called when I instantiate a B object. I've tried changing a lot of things around but it didn't help the situation. For example, I changed:

template <typename T = int> template <T t = 5> struct B...

to

template <typename T = int> struct B...

and changed

: public A<T>::C<t> {};

to

: public A<T>::C<T t = 5> {};

But I received even more errors:

prog.cpp:10:53: error: non-template 'C' used as template
prog.cpp:10:53: note: use 'A<T>::template C' to indicate that it is a template
prog.cpp:10:66: error: expected '{' before ';' token
prog.cpp: In function 'int main():
prog.cpp:14:7: error: missing template arguments before 'b'
prog.cpp:14:7: error: expected ';' before 'b'

I'm also curious about the first set of errors in which I got B was not declared in this scope. How could it not be? Is it the way I'm defining B? What could I be doing wrong?

4

1 回答 1

2

您必须对代码进行 2 处更改:

// First you don't need and should not use 2 templates
template <typename T = int, T t = 5> struct B
    // C++ doesn't know that A<T>::C is a template so you should say it here
    : public A<T>::template C<t> {};
于 2012-10-21T15:18:10.180 回答