M171
M171

Reputation: 83

"Declaration of xxx outside of class is not definition" error

This is the error:

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

This is the main.cpp file:

#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);
}

This is the 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

And finally this is the 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();
}

Upvotes: 6

Views: 43131

Answers (5)

Daniel
Daniel

Reputation: 133

In case somebody gets here because of the syntax error, please note that you can have the same error reported with a syntax error at initializing the parameters:

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

A::A ()
, b(0)  // Wrong. It should be ':' instead of ','
{
}

Upvotes: 11

Alok Save
Alok Save

Reputation: 206546

DataStream::DataStream();

Is a declaration of constructor for class DataStream. It must be declared within the class, not outside.

class DataStream
{
    public:
        DataStream();
};

Further, you can define this constructor inline inside the class or outside, like

DataStream::DataStream()
{}

Upvotes: 6

RedJohn
RedJohn

Reputation: 374

As other have already mentioned, this error might well be because of a syntax error. I had a Declaration of SomeClass outside of class is not definition error. The issue was a missing } after a for-loop:

void A::a_function() {
  for (int i = 0; i < 20; ++i) {
    // loop code
  // note the missing } here
  // function code
}

SomeClass* A::getSomeClassInstance() {
  // function code
}

Upvotes: 0

phonetagger
phonetagger

Reputation: 7873

Yet another way I managed to get this error, by defining a static std::vector of objects whose type was defined internal to the class:

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;

Upvotes: 0

dshepherd
dshepherd

Reputation: 5407

Another way you can end up with this error is something like the following code.

class A 
{
  void a_function();
};

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

The extra semicolon can be quite hard to spot if you haven't had enough caffeine yet...

Upvotes: 63

Related Questions