繁体   English   中英

模板类“序列/类名未命名类型”错误

[英]Template Class “Sequence/Class Name does not name a type” Error

我目前正在尝试学习C ++模板,无法理解当前的错误。

我试图根据本书的代码示例编写一个序列类。 我一直反复收到此错误。

我需要模块化编写此模板。 该功能工作,但我找不到错误的根源。 我尝试更改.cpp文件的名称没有成功。

这段代码几乎与我在书中发现并运行的那本书完全一样,没有任何问题。

这是我的头文件和实现文件的代码。

#ifndef SEQUENCE_H
#define SEQUENCE_H

#include <cstdlib>  // provides size_t

namespace CS3358_FA17_A04_sequenceOfNum
{
   template <class Item>
   class sequence
   {
   public:
      // TYPEDEFS and MEMBER CONSTANTS
      typedef Item value_type;
      typedef size_t size_type;
      static const size_type CAPACITY = 10;
      // CONSTRUCTOR
      sequence();
      // MODIFICATION MEMBER FUNCTIONS
      void start();
      void end();
      void advance();
      void move_back();
      void add(const Item& entry);
      void remove_current();
      // CONSTANT MEMBER FUNCTIONS
      size_type size() const;
      bool is_item() const;
      Item current() const;

   private:
      Item data[CAPACITY];
      size_type used;
      size_type current_index;
   };
}

#include "sequence.hpp"

.HPP文件:

namespace CS3358_FA17_A04_sequenceOfNum
{
   template <class Item>
   sequence<Item>::sequence() : used(0), current_index(0) { }

   template <class Item>
   void sequence<Item>::start() { current_index = 0; }

   template <class Item>
   void sequence<Item>::end()
   {
      current_index = (used > 0) ? used - 1 : 0;
   }

   template <class Item>
   void sequence<Item>::advance()
   {
      assert( is_item() );
      ++current_index;
   }

   template <class Item>
   void sequence<Item>::move_back()
   {
      assert( is_item() );
      if (current_index == 0)
         current_index = used;
      else
         --current_index;
   }

   template <class Item>
   void sequence<Item>::add(const Item& entry)
   {
       assert( size() < CAPACITY );

      size_type i;

      if ( ! is_item() )
      {
         if (used > 0)
            for (i = used; i >= 1; --i)
               data[i] = data[i - 1];
         data[0] = entry;
         current_index = 0;
      }
      else
      {
         ++current_index;
         for (i = used; i > current_index; --i)
            data[i] = data[i - 1];
         data[current_index] = entry;
      }
      ++used;
   }

   template <class Item>
   void sequence<Item>::remove_current()
   {
      assert( is_item() );

      size_type i;

      for (i = current_index + 1; i < used; ++i)
         data[i - 1] = data[i];
      --used;
   }

   template <class Item>
   typename sequence<Item>::size_type sequence<Item>::size() const { return used;}

   template <class Item>
   bool sequence<Item>::is_item() const { return (current_index < used); }

   template <class Item>
   typename sequence<Item>::Item sequence<Item>::current() const
   {
      assert( is_item() );

      return data[current_index];
   }
}

错误是:

序列未命名类型->在每个函数中都会发生

在每个使用模板说明符的位置“ <”之前的预期初始化程序。

我之前写过许多模板,但是由于编译器和链接器问题,我总是在同一文件中定义和实现。

任何帮助将不胜感激,这里是错误及其行的完整列表。

g++ -Wall -ansi -pedantic -c sequence.cpp
sequence.cpp:48:4: error: ‘sequence’ does not name a type
    sequence<Item>::sequence() : used(0), current_index(0) { }
    ^
sequence.cpp:51:17: error: expected initializer before ‘<’ token
    void sequence<Item>::start() { current_index = 0; }
                 ^
sequence.cpp:54:17: error: expected initializer before ‘<’ token
    void sequence<Item>::end()
                 ^
sequence.cpp:60:17: error: expected initializer before ‘<’ token
    void sequence<Item>::advance()
                 ^
sequence.cpp:67:17: error: expected initializer before ‘<’ token
    void sequence<Item>::move_back()
                 ^
 sequence.cpp:77:17: error: expected initializer before ‘<’ token
    void sequence<Item>::add(const Item& entry)
                 ^
sequence.cpp:102:17: error: expected initializer before ‘<’ token
    void sequence<Item>::remove_current()
                 ^
sequence.cpp:114:4: error: ‘sequence’ does not name a type
    sequence<Item>::size_type sequence<Item>::size() const { return used;         }
    ^
sequence.cpp:117:17: error: expected initializer before ‘<’ token
    bool sequence<Item>::is_item() const { return (current_index < used);     }
                 ^
sequence.cpp:120:4: error: ‘sequence’ does not name a type
    sequence<Item>::Item sequence<Item>::current() const

这是Makefile,还编辑了我对文件扩展名的更改。

a4s1: sequence.o sequenceTest.o
    g++ sequence.o sequenceTest.o -o a4s1

sequence.o: sequence.hpp sequence.h
    g++ -Wall -ansi -pedantic -c sequence.hpp

sequenceTest.o: sequenceTest.cpp sequence.hpp sequence.h
    g++ -Wall -ansi -pedantic -c sequenceTest.cpp

test:
    ./a4s1 auto < a4test.in > a4test.out

clean:
    @rm -rf sequence.o sequenceTest.o

cleanall:
    @rm -rf sequence.o sequenceTest.o a4s1

在头文件中包含实现 ”并不意味着#include <sequence.cpp> ,它实际上意味着在sequence.h包含所有内容。

可能的解决方案是:

  1. 将所有内容从sequence.cpp移至sequence.h并删除sequence.cpp。
  2. 将sequence.cpp重命名为sequence.imp或其他扩展名, 切勿自行对其进行编译 (将其完全从makefile中删除)。 它将在#include sequence.h的.cpp文件中进行编译(这可能是您的要求)。
  3. 保留sequence.cpp但在顶部包含#include <sequence.h>并使用显式模板实例化

必须在使用它们的每个编译单元中定义模板,请参见此处 这通常意味着必须将其实现放在头文件中。 如果您仍然要将实现放在一个单独的文件中,则可以创建一个“实现文件”,并将其包含在标题的末尾。 这似乎是您的教授建议的策略。

但是,构建文件可能不会将实现文件视为单独的编译单元。 它应以.imp或.hpp或其他名称结尾,但不能以.cpp结尾。

暂无
暂无

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

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