链接列表:错误:'<'之前的预期初始值设定项令牌

时间:2017-03-23 05:44:54

标签: c++ templates

我收到错误“错误:在'<'之前预期的初始化程序令牌“在编译时,我需要创建一个链表,我需要将其中一个函数转换为一个赋值模板,我想知道如何修复我得到的错误。

#ifndef LINK_H
#define LINK_H

class link {
public:
    int data;
    link *lnkPtr;
};


class linked
{
private:    

      link  *head;
public:

        linked(){head = nullptr;}
        ~linked(){};
        void nodeEnd(link *, double num);
        template <class T>
        T nodeBeg<T>(link *, T num);
        void nodeIst(link *, double num);
        void nodeDel(link *, double num);
        link fillLst(int);
        void prntLst(link *);
        void destLst(link *);
        link endLst(link *);
        //void addlink(link *, int);
};

  template <class T>
  T linked<T>::nodeBeg(link* , T num)
{
     link *newNode; // To point to a new node 
     link *nodePtr; // To move through the list 

     // Allocate a new node and store num there. 
     newNode = new link; 
     newNode->data = num; 
     newNode->lnkPtr = nullptr; 

     // If there are no nodes in the list 
     // make newNode the first node.
      if (!head) 
         head = newNode; 
      else // Otherwise, insert newNode at end. 
      { 
         // Initialize nodePtr to head of list. 
         nodePtr = head; 

         // Find the last node in the list. 
         // while (!nodePtr->linkPtr) 
            nodePtr = nodePtr->lnkPtr; 


         nodePtr->lnkPtr = head; //inserts at beginning
      } 
}
#endif /* LINK_H */

3 个答案:

答案 0 :(得分:0)

<T>T nodeBeg<T>(link *, T num);移除T linked<T>::nodeBeg(link* , T num)T nodeBeg(link *, T num)T linked::nodeBeg(link* , T num)将告诉编译器在编译时推断返回类型。此外,功能nodeBeg和课程linked都不是模板,因此您不需要<T>

答案 1 :(得分:0)

您的代码中存在一些语法错误 nodeBeg是一个功能模板 它的声明应如下:

template <class T> T nodeBeg(link *, T num);

定义应如下:

template <class T> T linked::nodeBeg(link*, T num) {/*...*/}

在这里,你必须将linked::附加到函数名称,告诉编译器你在这里定义类nodeBeg的成员linked

答案 2 :(得分:0)

在标识符后删除<T>。 id是专业化后的参数列表是模板专业化的意思。

类和成员模板的模板是两个不同的东西。成员可以是模板类中的模板,也可能不是,或类可能是模板。如果模板类的成员是模板,它有两个参数列表。

template<typename T1>
struct string {
    // member template function
    template<typename T2>
    int compare(const T2&);
    // constructors can be templates too
    template<typename T2>
    string(const std::basic_string<T2>& s) { /*...*/ }
};
// out of class definition of string<T1>::compare<T2> 
template<typename T1> // for the enclosing class template
template<typename T2> // for the member template
int string<T1>::compare(const T2& s) { /* ... */ }

(来自http://en.cppreference.com/w/cpp/language/member_template