[英]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
包含所有內容。
可能的解決方案是:
#include <sequence.h>
並使用顯式模板實例化 。 必須在使用它們的每個編譯單元中定義模板,請參見此處 。 這通常意味着必須將其實現放在頭文件中。 如果您仍然要將實現放在一個單獨的文件中,則可以創建一個“實現文件”,並將其包含在標題的末尾。 這似乎是您的教授建議的策略。
但是,構建文件可能不會將實現文件視為單獨的編譯單元。 它應以.imp或.hpp或其他名稱結尾,但不能以.cpp結尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.