【问题标题】:error "C++ requires a type specifier for all declarations"错误“C++ 需要所有声明的类型说明符”
【发布时间】:2013-06-30 04:52:20
【问题描述】:

我遇到了几个错误,[E1]“C++ 需要所有声明的类型说明符”、[E2]“使用未声明的标识符”和 [E3]“需要类名或命名空间”。

#ifndef MAIN_SAVITCH_SEQUENCE_H
#define MAIN_SAVITCH_SEQUENCE_H

    template <class T>
    class sequence
    {
    public:
        // TYPEDEFS and MEMBER CONSTANTS
        typedef T value_type;
        static const int CAPACITY = 30;
        // CONSTRUCTOR
        sequence( );
        // MEMBER FUNCTIONS
        void showSequence();
        void attach(value_type entry);
        value_type current( );
        void remove_current( );
        int size( );

    private:
        value_type data[CAPACITY];
        int used;

    };
    template <class T>
[E3]        sequence::sequence( )
    {
[E2]        used = 0;
    }
    template <class value_type>
[E3]    void sequence::attach(value_type entry)
    {
        data[used++] = entry;
    }

    sequence::value_type sequence::current( )
    //replace sequence::value_type with typename value_type for your template
    {
        return data[used-1];
    }

    void sequence::remove_current( )
    {
        used--;
    }

    int sequence::size( )
    {
        return used;
    }

    void sequence::showSequence()
    {
        std::string display = "";
        for (int i = 0; i<used; i++)
            std::cout << data[i] << "\n";

    }

#endif

【问题讨论】:

    标签: c++ templates c++11


    【解决方案1】:

    你可以简单地在模板类中定义函数

    template <class T>
    class sequence
    {
       //...
       sequence() : used(0) // define function inside template class.
       {
       }
       //...
    }
    

    或者您需要在模板声明之外定义的每个函数之前添加template &lt;class T&gt;&lt;T&gt;

    template <class T>
    sequence<T>::sequence( )
    ^^^^^^^^^^^
    {
        used = 0;
    }
    
    template <class value_type>
    void sequence<T>::attach(value_type entry)
         ^^^^^^^^^^^
    {
        data[used++] = entry;
    }
    
    template <class T> 
    typename sequence<T>::value_type sequence<T>::current( )   
             ^^^^^^^^ // 1. value_type comes from sequence template, so you need to specify sequence<T>
    ^^^^^^^
    // 2. sequence<T>::value_type type depends on template parameter, so typename is needed
    {
        return data[used-1];
    }
    

    使用方法:

    sequence<int> test;
             ^^^^ // sequence is a template, you need to specify a type
    

    【讨论】:

    • 在类定义内部,这些是隐含的,没有必要,而在外部它们是,对吗?
    • 在模板类中定义它们时,不需要它们。
    • 你不会有地方把它们放在课堂上,这是没有意义的
    • 这修正了很多错误,谢谢。你知道我哪里出错了吗:template &lt;class T&gt; typename value_type sequence&lt;T&gt;::current( ) { return data[used-1]; }
    • 我对@9​​87654327@ 的更新回答对您有帮助吗? value_type 需要来自 sequence 并且它的类型取决于模板参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2017-06-05
    • 1970-01-01
    • 2018-03-01
    • 2022-11-14
    相关资源
    最近更新 更多