“类外xxx声明不定义”错误

时间:2013-05-09 15:34:58

标签: c++

这是错误:

error: declaration of 'DataStream::DataStream()' outside of class is not definition [ fpermissive]|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|

这是main.cpp文件:

#include <iostream>
#include <iomanip>
#include "DataStream.h"
#include "MsgPacket.h"


using namespace std;

DataStream * Packet = new DataStream();
DataStream::DataStream();



int main() {

int source;
int destination;
int type;
int port;
int input;
std::string data;

cout << "My Assignment" << endl;;


MsgPacket * Packet = new MsgPacket(source,destination,type,port,data);

}

这是MsgPacket.h

#ifndef MSGPACKET_H
#define MSGPACKET_H

#include <string>
#include "PacketAddress.h"

using namespace std;

class MsgPacket : public PacketAddress {
public:
    MsgPacket();
    MsgPacket (const MsgPacket & rhs);
    MsgPacket(string dataIn);
    MsgPacket(int source, int destination, int port, int type, std::string data);
    MsgPacket(int ,char data);
    string toString();
    string getData() const {return _data;};
    void setData(string inData) {_data = inData;};
    string dataOutput();
    virtual ~MsgPacket();
    virtual MsgPacket * Clone() { return new MsgPacket(*this); }
protected:
    string _data;
};

#endif // MSGPACKET_H

最后这是MsgPacket.cpp

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
#include "msgpacket.h"


using namespace std;

MsgPacket::MsgPacket():
PacketAddress(0,0)
{

}

MsgPacket::MsgPacket (const MsgPacket & rhs):
PacketAddress(rhs),
_data(rhs.getData())
{

}

MsgPacket::MsgPacket(string dataIn):
PacketAddress(0,0){
string temp;
temp = dataIn.substr (0,4);
_source = atoi(temp.c_str());
temp = dataIn.substr (5,4);
_dest = atoi(temp.c_str());
temp = dataIn.substr (10,4);
_type = atoi(temp.c_str());
temp = dataIn.substr (15,4);
_port = atoi(temp.c_str());
_data = dataIn.substr (20,dataIn.length());
#ifdef DEBUG
cout << "CREATE PACKET: " << this->toString() << endl;
#endif
}

MsgPacket::MsgPacket(int source, int destination):
PacketAddress(source,destination)
{

 }

 MsgPacket::MsgPacket(int source, int destination, int port):
PacketAddress(source,destination)
{
 _port = port;
}

 MsgPacket::MsgPacket(int source, int destination, int type, int port, std::string       data):
 PacketAddress(source, destination)
{
_source = source;
_dest = destination;
_type = type;
_data = data;
_port = port;
}

string MsgPacket::dataOutput()
{
stringstream output;//create a stringstream
output << setw(4) << setfill('0') << _source << ":" <<  setw(4) << setfill('0') <<  _dest << ":" << setw(4) << setfill('0') << _type << ":" << setw(4) << setfill('0') << _port     << ":" << _data;
 return output.str();
}

 string MsgPacket::toString()
{
stringstream output;//create a stringstream
output << "[" << showbase << hex << this  << "] S:[" << _source << "] D:[" << _dest << "] P:[" << _type << "] T:[" << _port << "]" << " DATA[" << _data << "]";
return output.str();
}

4 个答案:

答案 0 :(得分:33)

另一种可以结束此错误的方法类似于以下代码。

class A 
{
  void a_function();
};

A::a_function();   // Note the semicolon here
{
  // function contents...
}

如果你还没有足够的咖啡因,可能很难发现额外的分号......

答案 1 :(得分:4)

如果由于语法错误而有人到达此处,请注意您在初始化参数时可能会报告相同的错误并出现语法错误:

class A
{
  A ();
  char b;
};

A::A ()
, b(0)  // wrong, should be ':' instead of ','
{
}

答案 2 :(得分:2)

DataStream::DataStream();

是类DataStream的构造函数声明,它必须在不在外面的类中声明。

class DataStream
{
    public:
        DataStream();
};

此外,您可以在类内部或外部内联定义此构造函数,例如

DataStream::DataStream()
{}

答案 3 :(得分:0)

另一种方法是,我通过定义类型在类内部定义的对象的static std::vector来获得此错误:

template<typename Ty>
class MyTemplatedClass
{
public:
   struct AStructThatBelongsToMyTemplatedClass
   {
      uint32_t aU32ThatsPartOfTheStructThatBelongsToMyTemplatedClass;
   };

   static uint32_t u32;
   static AStructThatBelongsToMyTemplatedClass aStructInstance;
   static std::vector<uint32_t> vectOfu32;
   static std::vector<AStructThatBelongsToMyTemplatedClass> vectOfStructInstances;
};

template<typename Ty> uint32_t MyTemplatedClass<Ty>::u32;
template<typename Ty> std::vector<uint32_t> MyTemplatedClass<Ty>::vectOfu32;

// This produces error: need 'typename' before 'MyTemplatedClass<Ty>::AStructThatBelongsToMyTemplatedClass' because 'MyTemplatedClass<Ty>' is a dependent scope
//template<typename Ty> MyTemplatedClass<Ty>::AStructThatBelongsToMyTemplatedClass MyTemplatedClass<Ty>::aStructInstance;
// ...but this works ok:
template<typename Ty> typename MyTemplatedClass<Ty>::AStructThatBelongsToMyTemplatedClass MyTemplatedClass<Ty>::aStructInstance;

// This produces error: declaration of 'std::vector<MyTemplatedClass<Ty>::AStructThatBelongsToMyTemplatedClass> MyTemplatedClass<Ty>::vectOfStructInstances' outside of class is not definition
//template<typename Ty> std::vector<MyTemplatedClass<Ty>::AStructThatBelongsToMyTemplatedClass> MyTemplatedClass<Ty>::vectOfStructInstances;
// ...but this works ok (the only thing I added was 'typename'):
template<typename Ty> std::vector<typename MyTemplatedClass<Ty>::AStructThatBelongsToMyTemplatedClass> MyTemplatedClass<Ty>::vectOfStructInstances;