【问题标题】:Must type template every time for generic functions?必须每次都为泛型函数键入模板?
【发布时间】:2013-05-17 02:44:30
【问题描述】:

在 C++ 中,有什么方法可以避免每次我在其类定义之外编写类函数时都必须键入模板名称?

例如,如果我想定义一个类函数,是否必须在每个函数之前键入template <class T>?如果我已经指定该类使用模板,这似乎是很多不必要的工作。

例如...

template <class T>
void LinkedList<T>::addFirst(T data) {
//my code...
}

当我已经指定 LinkedList 使用泛型时,为什么我必须输入 template &lt;class T&gt;?我已经习惯了泛型在 Java 中的工作方式,所以这对我来说是新的。

【问题讨论】:

  • 为什么不在类中定义函数?
  • 在 C++ 中有模板的部分和显式特化,因此您必须在类定义之外的类成员的每个定义之前编写 template &lt;class T&gt;。例如。 template &lt;&gt; void LinkedList&lt;int&gt;::addFirst(int data) {/*...*/}
  • 哦,因为我读到类中定义的函数是内联的,通常不应该太大。
  • 确实如此(它们是inline 隐含),但inline 并不意味着它们是内联的;您可以在类外部定义它们,因为它可能更易于阅读,但在类内部执行会更方便一些。对于类模板,您必须(有例外)在头文件中提供成员函数的定义,因此您不能像普通类一样将它们放在源文件(.cpp)中(这样可以加快编译速度)。跨度>
  • @Duncan 模板定义无论如何都是内联的(否则它们会破坏 ODR);所以无论你在类定义内部还是外部定义它们都没有区别。

标签: c++ templates generics


【解决方案1】:
//release 1:
template <class T>
struct LinkedList
{
    void addFirst(T data);
};

//release 2: partial specialization 
template <class T>
struct LinkedList<T*>
{
    void addFirst(T data);
};

//release 1: 
template <class T>
void LinkedList<T>::addFirst(T data) {}

//release 2
template <class T>
void LinkedList<T*>::addFirst(T data) {}

//complier could not tell which release
//void LinkedList::addFirst(T data){}

void main(){

    LinkedList<char> lc;
    lc.addFirst('c');

    LinkedList<char*> li;
    li.addFirst('c');
}

【讨论】:

    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多