【问题标题】:C++ 11 template Class create instanceC++ 11 模板类创建实例
【发布时间】:2015-05-18 17:45:48
【问题描述】:

这是我的头文件的摘录

template <typename E>
class Container {
public:
  Container& operator=(const Container&) = delete;
  Container(const Container&) = delete;
  Container() = default;

  virtual ~Container() { }
...

然后我创建了另一个头文件来声明一个新类并实现方法(这些现在没有显示)

template <typename E>
class SepChaining : public Container<E> {
  size_t nmax;
  size_t n;
  int *values;
public:

  SepChaining<E>( size_t nmax ) : nmax(nmax), n(0), values( new int[this->nmax]) { }

  virtual ~SepChaining<E>( );

在这里,我创建了一个继承 Container 类的新类 SepChaining,并创建了一个构造函数来分配 nmaxvalues

现在我的问题是:如何创建此类的新实例?我真的很困惑我需要在哪里指定实际模板值,比如int

编辑:

头文件.h

 #include <iostream>
 #include <functional>

enum Order { dontcare, ascending, descending };

template <typename E>
class Container {
public:
  Container& operator=(const Container&) = delete;
  Container(const Container&) = delete;
  Container() = default;

  virtual ~Container() { }

  virtual void add(const E& e) { add(&e, 1); }
  virtual void add(const E e[], size_t s) = 0;

  virtual void remove(const E& e) { remove(&e, 1); }
  virtual void remove(const E e[], size_t s) = 0;

  virtual bool member(const E& e) const = 0;
};

SepChaining.h

 #include <iostream>
 #include "Container.h"

template <typename E>
class SepChaining : public Container<E> {
    size_t nmax;
    size_t n;
    int *values;
public:

    SepChaining<E> ( size_t nmax ) : nmax(nmax), n(0), values(new int[this->nmax]) { }

    virtual ~SepChaining ();

    using Container<E>::add;
    virtual void add(const E e[], size_t s);

    using Container<E>::remove;
    virtual void remove(const E e[], size_t s);

    virtual bool member(const E& e) const;

};

SepChaining.cpp

#include <iostream>
#include "SepChaining.h"

template <typename E>
SepChaining<E>::~SepChaining( ){
    delete[] values;
}

template <typename E>
void SepChaining<E>::add(const E e[], size_t s) {
    std::cout << "Add method";
}

template <typename E>
void SepChaining<E>::remove(const E e[], size_t s) {
    std::cout << "Remove method";
}

template <typename E>
bool SepChaining<E>::member(const E &e) const {
    for (size_t i = 0; i < n; ++i) {
        if (values[i] == e) return true;
    }
    return false;
}

所以这是我的三个文件,main.cpp 只是初始化构造函数,正如你告诉我的那样。我看不出我的代码有任何问题..

【问题讨论】:

    标签: c++11 constructor


    【解决方案1】:

    只需将E 更改为int

    SepChaining<int> instance;
    

    【讨论】:

    • 当我尝试这样做时,我收到以下错误:main.o ld 中的 _main: symbol(s) not found for architecture x86_64
    • 那是一个不同的问题,例如在这里解决:stackoverflow.com/questions/11852568/…(你必须调用 g++ 而不是 gcc)
    • 我已经包含了这个库,但是我得到了同样的错误:架构 x86_64 的未定义符号:“SepChaining::add(int const*, unsigned long)”,引用自: main-ce609f.o "SepChaining::~SepChaining()" 中 SepChaining 的 vtable,引用自: main-ce609f.o "SepChaining::member(int) 中 SepChaining 的 vtable const&) const",引用自:vtable for SepChaining in main-ce609f.o ld:未找到架构 x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
    • 这又是一个不同的问题。你必须实现派生的析构函数:virtual ~SepChaining&lt;E&gt;( ) {}
    • 我已经编辑了我的原始帖子,我想它会让你更好地了解我在做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多