簡體   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