模板类“序列/类名称未命名类型”错误(Template Class “Sequence/Class Name does not name a type” Error)

编程入门 行业动态 更新时间:2024-10-27 14:25:38
模板类“序列/类名称未命名类型”错误(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]; } }

错误是:

sequence没有命名类型 - >这发生在每个函数中

在'<'之前的预期初始化程序使用模板说明符。

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

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

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

I'm currently trying to learn templates in C++ and am unable to make sense of this current Error.

I was trying to write a sequence class based out of a code example from the book. I keep getting this error repeatedly.

I am required to write this template modularly. The functions work, but i can't find the source of the errors. I have tried changing name of .cpp file with no success.

This code is nearly identical to that which i found and ran in the book which compiled with no issues.

Here is my Code for header and implementation files.

#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 File:

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]; } }

Error's Are:

sequence does not name a type -> this occurs in every function

expected initializer before '<' every place a template specifier is used.

I have written many templates before, but i have always defined and implemented in the same file because of compiler and linker issues.

Any help would be much appreciated, here is a complete list of errors and their lines.

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

Here is Makefile, Also edited my changes in the file extensions.

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包含所有内容。

可能的解决方案是:

将所有内容从sequence.cpp移动到sequence.h并删除sequence.cpp。 将sequence.cpp重命名为sequence.imp或其他扩展名,并且永远不要自己编译它 (将它从makefile中完全删除)。 它将在#include sequence.h的.cpp文件中编译(这可能是你所要求的)。 保持sequence.cpp,但#include <sequence.h>位于顶部,并使用显式模板实例化 。

"include the implementation in the header file" doesn't mean #include <sequence.cpp>, it means to actually have everything in sequence.h.

The possible solutions are:

Move everything from sequence.cpp to sequence.h and delete sequence.cpp. Rename sequence.cpp to sequence.imp or some other extension and never compile it by itself (remove it from the makefile altogether). It will be compiled in the .cpp file(s) that #include sequence.h (this is probably what is asked of you). Keep sequence.cpp but #include <sequence.h> at the top and use explicit template instantiation.

更多推荐

本文发布于:2023-08-02 19:37:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1380619.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:序列   模板   错误   名称   类型

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!