【问题标题】:How to declare a two-dimensional templated class-type vector?如何声明二维模板类类型向量?
【发布时间】:2017-05-11 23:48:10
【问题描述】:

我正在测试我对 C++ 泛型的了解。虽然我已经掌握了它,但我仍然需要加强我对该主题的了解。目前,我在使用模板类构造函数时遇到问题。我收到一个未定义的参考错误。因为我知道编译器需要访问整个模板定义才能为模板的每个实例化编译代码,所以我将构造函数的定义保留在 .h 文件中,如下所示:

  #ifndef CLASS1_H
  #define CLASS1_H

  #include <vector>
  #include <string>
  using namespace std;

  template <class T, int N>
  class Class1{
  public:

  Class1(string inName, int capacity);

  private:
   string m_name;
   int m_capacity;
  };

  template <class T, int N>
  Class1<T, N>::Class1(string inName, int capacity) {
    m_name = inName;
    m_capacity = capacity;
  }

  #endif

据我所知,这是我正确声明的。以下类 Class2.cpp 在其构造函数参数中使用 Class1 的构造函数:

 #include "Class2.h"

 using namespace std;

 Class2::Class2(vector< Class1 <ClassPI, 3141> > ident) { 
   m_ident = ident;
 }

我尝试在“Class2.cpp”的底部声明“模板类 Class1 underCode”,但它不起作用(因为我已经实现了 Class2 构造函数(?))。这是 Class2 的头文件:

 #ifndef CLASS2_H
 #define CLASS2_H

 #include "Class1.h"
 #include "ClassPI.h"

 class Class2 {
 public:
   Class2(vector< Class1<ClassPI, 3141> > ident);


 private:
   vector< Class1<ClassPI, 3141> > m_ident;
 };

 #endif

最后,这是主类:

 #include "Class2.h"
 #include "Class1.h"
 #include "ClassPI.h"
 #include <vector>

 using namespace std;

 int main() {

 vector< Class1<ClassPI, 159> > vect;

 Class2 class2 ( vect );

 }

我在编译代码时收到以下错误消息:

 main.cpp: In function ‘int main()’:
 main.cpp:12: error: no matching function for call to 
 ‘Class2::Class2(std::vector<Class1<ClassPI, 234>, std::allocator<Class1<ClassPI, 234> > >&)’
 Class2.h:9: note: candidates are: Class2::Class2(std::vector<Class1<ClassPI, 3141>, std::allocator<Class1<ClassPI, 3141> > >)
 Class2.h:7: note:                 Class2::Class2(const Class2&)
 make: *** [main] Error 1

如上所示,我已经定义了构造函数。这是我认为我收到此错误消息的唯一原因,但显然这不是正确的原因。我还缺少什么?

附注: ClassPI.h:

#ifndef CLASSPI_H
#define CLASSPI_H

#include "ClassPI.h"

using namespace std;

class ClassPI
{
 public:

 ClassPI();
};

#endif

ClassPI.cpp:

 #include"ClassPI.h"
 using namespace std;

 ClassPI::ClassPI(){}

Class3.h

 #ifndef CLASS3_H
 #define CLASS3_H

 using namespace std;

 template <class T, int N>
 class Class3 {
 public:
   Class3(); 
 };

【问题讨论】:

  • 我无法复制,这意味着我正在做一些不同的事情。请给我们一个minimal reproducible example 好吗?
  • 当实际的错误信息是error: no matching function for call to...时,为什么你在标题中加上了“未定义的引用”
  • 不管怎样,把159改成3141,反之亦然
  • @M.M 我最初得到了“未定义的引用”错误,但我编辑了原始帖子,但在编辑我的帖子以确保正确性的过程中,我得到了一个不同的错误,我忘了更改标题。感谢您的意见!

标签: c++ templates vector constructor


【解决方案1】:

问题是我在主文件中将 const 参数从原始值 (3141) 更改为 159。于是我又回去改成:

vector< Class1<ClassPI, 3141> > vect;

代码运行编译成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2011-05-06
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多