繁体   English   中英

C ++模板和指针

[英]C++ template and pointers

我有模板和指针的问题(我认为)。 以下是我的代码的一部分:

/* ItemCollection.h */

#ifndef ITEMCOLLECTION_H
#define ITEMCOLLECTION_H

#include <cstddef>

   using namespace std;

   template <class T> class ItemCollection
   {
   public:
    // constructor
        //destructor 

     void insertItem( const T );

   private:
         struct Item
         {
          T price;
          Item* left;               
          Item* right;          
         };
         Item* root;     
         Item* insert( T, Item* );

   };
 #endif

和具有功能定义的文件:

/* ItemCollectionTemp.h-member functions defintion */

#include <iostream>
#include <cstddef>

#include "ItemCollection.h"

template <class T>
   Item* ItemCollection <T>::insert( T p, Item* ptr)
   {
      // function body
   }

以下是此行代码生成的错误:

Item* ItemCollection <T>::insert( T p, Item* ptr)

错误:

错误C2143:语法错误:缺少';' 在'*'之前

错误C4430:缺少类型说明符 - 假定为int。 注意:C ++不支持default-int

错误C2065:'类型':未声明的标识符

错误C2065:'类型':未声明的标识符

错误C2146:语法错误:在标识符'p'之前缺少')'

错误C4430:缺少类型说明符 - 假定为int。 注意:C ++不支持default-int

错误C2470:'ItemCollection :: insert':看起来像一个函数定义,但是没有参数列表; 跳过明显的身体

错误C2072:'ItemCollection :: insert':函数的初始化

错误C2059:语法错误:')'

任何帮助深表感谢。

简短的回答是Alexey已经发布的内容:

template <typename T>
typename ItemCollection<T>::Item* ItemCollection<T>::insert( T p, Item * ptr ) {
   // ...
}

(要理解为什么需要typename ,搜索SO以获取相关问题,或者删除注释。我将把答案集中在查找规则中,解释为什么必须以不同的方式声明返回和参数类型)

解释是c ++中的查找规则对返回类型和其余参数具有不同的范围。 当编译器看到定义AB::c( D ) ,在定义的封闭命名空间中检查A ,就像B 当编译器找到::c它在类B查找c 此时,定义的其余部分在其余参数的B类范围内。 这意味着如果返回类型是类的内部类型,则必须使用返回类型的限定名称,而在D的情况下,编译器将首先在类B查找它。

这就解释了为什么返回类型必须完全限定,即使最后一个参数不是。 当编译器找到参数Item * ptr ,它已经在类的范围内,并且它将在那里找到它。 另一方面,封闭命名空间中没有定义Item

升级标准中的一个变化将解决这个问题,即使它没有考虑到这个目的而设计。 如果我没记错,下面的语法应该在没有完整类型限定的情况下编译:

template <T>
auto ItemCollection<T>::insert( T p, Item * ptr ) -> Item *
{
   return 0;
}

原因完全一样。 在解析了ItemCollection<T>::insert之后,将在ItemCollection<T>范围内验证其余标记,包括-> Item *返回定义。

template <class T> 
   typename ItemCollection <T>::Item* ItemCollection<T>::insert( T p, Item* ptr) 
   { 
      // function body 
   } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM