C++模板问题

发布于 2024-10-12 08:50:49 字数 849 浏览 1 评论 0原文

对于以下代码:

#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;
}

我收到错误:

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

我从未使用过 C++ 模板 - 这是什么意思?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一江春梦 2024-10-19 08:50:49

当您声明 Foo 的实例时,您缺少类型。

在您的情况下,您需要:

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

您还需要将关键字 typename 添加到行中:

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

请参阅 此处了解为什么您需要 typename。

编辑,这是在本地编译和运行的代码的修改版本:

#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;
}

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文