Kay
Kay

Reputation: 845

C++ Templates Issue

For the following code:

#include <map>
#include <iostream>
#include <string>

using namespace std;

template <class T>
class Foo{
  public:
    map<int, T> reg;
    map<int, T>::iterator itr;

    void add(T  str, int num) {
      reg[num] = str;
    }

    void print() {
      for(itr = reg.begin(); itr != reg.end(); itr++) {
        cout << itr->first << " has a relationship with: ";
        cout << itr->second << endl;
      }
    }
};

int main() {
  Foo foo;
  Foo foo2;
  foo.add("bob", 10);
  foo2.add(13,10);
  foo.print();
  return 0;
}

I get the error:

 type std::map<int, T, std::less<int>, std::allocator<std::pair<const int, T> > > is not derived from type Foo<T>

I've never used C++ templates - What does this mean?

Upvotes: 1

Views: 147

Answers (1)

Mic
Mic

Reputation: 6981

You're missing the type when you declare instances of Foo.

In your case, you would want:

  Foo<std::string> foo;
  Foo<int> foo2;

You will also need to add the keyword typename to the line:

    typename map<int, T>::iterator itr;

See here for why you'll need typename.

Edit, here's a modified version of your code that compiles and runs locally:

#include <map>
#include <iostream>
#include <string>

using namespace std;

template <class T>
class Foo{
public:
    map<int, T> reg;
    typename map<int, T>::iterator itr;

    void add(T  str, int num) {
        reg[num] = str;
    }

    void print() {
        for(itr = reg.begin(); itr != reg.end(); itr++) {
            cout << itr->first << " has a relationship with: ";
            cout << itr->second << endl;
        }
    }
};

int main() {
    Foo<std::string> foo;
    Foo<int> foo2;
    foo.add("bob", 10);
    foo2.add(13,10);
    foo.print();
    return 0;
}

Upvotes: 3

Related Questions