【问题标题】:Expected constructor, destructor, or type conversion before ‘<’ token“<”标记之前的预期构造函数、析构函数或类型转换
【发布时间】:2011-06-22 10:29:48
【问题描述】:

我是 C++ 新手,但我似乎无法弄清楚是什么导致了这些错误。

以下是我的头文件:

#ifndef TABLE
#define TABLE

#include <iostream>
#include <cstdlib>
#include <vector>

typedef struct {
    double successful , unsuccessful[2] ;
} Perform ;

using namespace std ;

template <class DATA>
class Table {

private :
    vector<DATA>* slot;
    vector<bool>* passBits;
    vector<bool>* full;
    int tableSize;

public :
    explicit Table ( unsigned size = 5 ) ;
    ~Table( ) ; //destructor
    void empty ( ) ;
    bool insert ( DATA & data ) ;
    bool insertD ( DATA & data ) ;
    bool fetch ( DATA & data ) const ;
    void print ( ostream & ) const ;
    Perform perform ( ) const ;
} ;

template <class DATA>
ostream & operator << ( ostream & out , const Table<DATA> & table )
{
    table.print( out ) ;   return out ;
}

#include "table.cpp"

#endif

我的table.cpp如下:

template <class DATA>
Table<DATA> :: Table ( unsigned size ) // Error
{

}

template <class DATA>
Table<DATA> :: ~Table( ) // Error
{

}

template <class DATA>
void Table<DATA> :: empty ( ) // Error
{

}

template <class DATA>
bool Table<DATA> :: insertD ( DATA & data ) // Error
{

}

#include "MyData.hpp"

标记为// Error 的前两行有错误。最后两个有一个“在‘

这是给我的大纲。除了私有字段,我不允许修改 table.hpp 文件。

任何帮助将不胜感激。

【问题讨论】:

  • 谁或什么书在教授 .cpp 文件中#include 的糟糕做法?
  • 为什么要在头文件中包含.cpp 文件?这很不寻常。通常情况下是相反的(.cpp 文件,包括头文件)。
  • 这是给我的“大纲”。

标签: c++ templates g++ hashtable


【解决方案1】:

您正在编译一个不是的 .cpp 文件。将你的类模板的构造函数、方法等的定义直接放到类定义中,并删除你的.cpp文件。

例如,将编译器看到的代码与shows your first error 进行比较:

template<class DATA>
Table<DATA>::Table(unsigned size) {}

请注意,此代码在尝试定义此 ctor 之前未定义 Table 类模板,因此编译器首先对able 应该是什么感到困惑。


您可以解决妨碍正确修复代码的脑死指令。首先,永远不要编译 table.cpp 并且不要让工具假设他们可以编译或处理它作为实现文件(许多人正确地假设)。其次,在 table.cpp 的顶部包含您的标题(table.hpp?),因为您不太可能使用 .cpp 作为有效的实现文件来捕获所有出现的工具。

【讨论】:

  • 问题是除了 table.cpp 文件之外,我不允许修改任何内容。我可以更改的 table.hpp 的唯一部分是私有字段
  • @John:这太不幸了。也许这是您的课堂、讲座或其他方面唯一严重的问题,但如果还有更多问题,您至少可以为自己获得一个good book。您应该使用此限制更新问题。
  • @John 那么为什么不把#include "table.hpp" 放在那个 .cpp 文件的顶部呢。
  • +1,除了最后一句。 table.hpp 是一个“内联头文件”,其中包含所有内联函数的定义。它被客户间接包括在内。我将其视为table.inlines.hpp 以避免与源文件混淆。
  • @AndréCaron:您的意思是“table.cpp 是...”吗?我不明白你是如何知道 John 是如何使用 table.hpp 的,但我确实试图强调 table.cpp 不应该以“.cpp”命名。因为 table.cpp 依赖于 header 并且被独立使用(即编译),它应该包含 header;最后一句有什么问题?
【解决方案2】:

这个问题可以通过将模板的定义放到头文件中来解决。 C++ 不支持在不同文件中分离模板的声明和定义。 看到这个 Storing C++ template function definitions in a .CPP file

但是,IBM xlc 和 HP acc 等一些编译器可以做到这一点。

【讨论】:

    【解决方案3】:

    我看不出您提供的代码有任何问题(除了 .cpp 文件的异常包含,但这是合法的)。

    因此,我认为您正在尝试编译 table.cpp。如果是这样,那么这是您的错误,因为它是通过头文件中的include 语句编译的。

    你只需要编译你使用模板的文件。

    编辑:当在#include "table.h" 中正确使用test.cpp 时,它编译得很好。当我尝试编译 table.cpp(在 MSVS 2010 上)时,我得到了 'missing ;在 之前

    【讨论】:

    • John 不会编译table.cpp,它是一个“内联头文件”。我经常看到这是table.inlines.hpp
    • @André Caron:你怎么知道他没有尝试 tompile table.cpp ?你坐在他旁边吗?而且我知道他将其用作包含文件。而“内联头文件”是一个荒谬的术语。
    • @AndréCaron:很可能他的工具会自动编译它——例如在它被“添加到项目”之后——因为它被命名为“.cpp”。
    猜你喜欢
    • 2011-12-04
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多