【问题标题】:How to instantiate a template class when constructor takes arguments当构造函数接受参数时如何实例化模板类
【发布时间】:2014-04-03 22:51:28
【问题描述】:

我正在尝试使用以下内容创建 Queue<T> 类的新对象:

Queue<char[40]> *q = new Queue<char[40]>(100);

然后,我想在另一个类构造函数上使用这个q

Interface<char[40]> i(q);

如果我只是使用它,我会收到一条错误消息invalid conversion from ‘Queue&lt;char [40]&gt;*’ to ‘int’,我认为这意味着我正在尝试传递 q 的值,它是指向它的指针而不是实际值。美好的。然后我重新定义了Interface&lt;T&gt;构造函数来接收指针而不是值本身,所以签名是

Interface(DataStructure<T>& q);

由于队列扩展了 DataStructure。由于某种原因,现在q 的实例化失败了:

undefined reference to `Queue<char [40]>::Queue(int)

但我很确定我已经编写了带有 INT 参数的构造函数方法

template<typename T>
Queue<T>::Queue(int size): DataStructure<T>(size) {
    std::cout << size << std::endl;
}

那为什么我会得到这个错误呢?玩指针只会弄得一团糟,我现在不知道该怎么办。

【问题讨论】:

  • "undefined reference" 似乎建议您在源文件中而不是在头文件中定义构造函数。stackoverflow.com/questions/495021/…
  • 另外注意:这个char[40] 看起来有点可疑。也许您想改用std::string
  • @dyp 这个构造函数在头文件中定义为Queue(int size);
  • 这是否意味着您在源文件中确实定义了(= 问题中显示的块;函数的定义包含函数体{ /*...*/ })?这不适用于类模板的成员函数。请阅读我上面链接的问答。
  • @dyp 好的,现在可以了。还有一个问题:要使用带有char[40] 的模板,我必须在任何地方都使用指针吗?如果我想在函数中返回某些东西的值,它会抱怨我正在返回一个数组。

标签: c++ templates pointers queue instantiation


【解决方案1】:

此代码Queue&lt;T&gt;::Queue(int size) 建议您将定义放在源文件中。如果您使用模板,您的所有代码都必须在头文件中。 (还有其他方法,但这是最简单的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2011-06-04
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多