C++ &引用;类外xxx的声明不是定义“;错误

C++ &引用;类外xxx的声明不是定义“;错误,c++,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> #inclu

这就是错误:

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);
#包括
#包括
#包括“DataStream.h”
#包括“MsgPacket.h”
使用名称空间std;
数据流*数据包=新数据流();
DataStream::DataStream();
int main(){
int源;
int目的地;
int型;
国际港口;
int输入;
std::字符串数据;
库特
是类
数据流
的构造函数声明,必须在类内而不是外部声明

class DataStream
{
    public:
        DataStream();
};
此外,您可以在类内部或外部内联定义此构造函数,如

DataStream::DataStream()
{}
是类
数据流
的构造函数声明,必须在类内而不是外部声明

class DataStream
{
    public:
        DataStream();
};
此外,您可以在类内部或外部内联定义此构造函数,如

DataStream::DataStream()
{}

如果有人因为语法错误而来到这里,请注意,在初始化参数时,您可能会报告与语法错误相同的错误:

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

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

如果有人因为语法错误而来到这里,请注意,在初始化参数时,您可能会报告与语法错误相同的错误:

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

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

另一种导致此错误的方法类似于下面的代码

class A 
{
  void a_function();
};

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

如果您还没有摄入足够的咖啡因,那么额外的分号可能很难识别…

另一种可能导致此错误的方法类似于下面的代码

class A 
{
  void a_function();
};

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

如果您还没有足够的咖啡因,那么额外的分号可能很难识别…

还有另一种方法,我通过定义一个类型在类内部定义的对象的
静态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;
模板
类MyTemplatedClass
{
公众:
属于MyTemplatedClass的结构结构
{
不包含属于我的模板类的结构的单元32;
};
静态uint32_t u32;
属于我的模板类结构的静态结构;
静态std::向量vectOfu32;
静态std::向量vectOfStructInstances;
};
模板uint32_t MyTemplatedClass::u32;
模板std::vector MyTemplatedClass::vectOfu32;
//这会产生错误:“MyTemplatedClass::AStructThatBelongsToMyTemplatedClass”之前需要“typename”,因为“MyTemplatedClass”是一个从属作用域
//模板MyTemplatedClass::AstructThat属于MyTemplatedClass MyTemplatedClass::AstructionInstance;
//…但这没问题:
模板类型名称MyTemplatedClass::AstructThatThatThatToMyTemplatedClass MyTemplatedClass::AstructionInstance;
//这将产生错误:类外的“std::vector MyTemplatedClass::vectOfStructInstances”声明不是定义
//模板std::vector MyTemplatedClass::vectOfStructInstances;
//…但这一切正常(我只添加了“typename”):
模板std::vector MyTemplatedClass::vectOfStructInstances;

另一种方法是通过定义一个对象的
静态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;
模板
类MyTemplatedClass
{
公众:
属于MyTemplatedClass的结构结构
{
不包含属于我的模板类的结构的单元32;
};
静态uint32_t u32;
属于我的模板类结构的静态结构;
静态std::向量vectOfu32;
静态std::向量vectOfStructInstances;
};
模板uint32_t MyTemplatedClass::u32;
模板std::vector MyTemplatedClass::vectOfu32;
//这会产生错误:“MyTemplatedClass::AStructThatBelongsToMyTemplatedClass”之前需要“typename”,因为“MyTemplatedClass”是一个从属作用域
//模板MyTemplatedClass::AstructThat属于MyTemplatedClass MyTemplatedClass::AstructionInstance;
//…但这没问题:
模板类型名称MyTemplatedClass::AstructThatThatThatToMyTemplatedClass MyTemplatedClass::AstructionInstance;
//这将产生错误:类外的“std::vector MyTemplatedClass::vectOfStructInstances”声明不是定义
//模板std::vector MyTemplatedClass::vectOfStructInstances;
//…但这一切正常(我只添加了“typename”):
模板std::vector MyTemplatedClass::vectOfStructInstances;

将类包含在文件中。它已在名为datastream.h(头文件)的文件中的类中声明。如果未执行此操作,则会出现另一个错误:“未定义对
MsgPacket::MsgPacket(int,int,int,int,std::string)的引用”“|对
DataStream::DataStream()”的未定义引用”| | |===构建完成:2个错误,0个警告(0分钟,1秒)=====|,用于将类包含在文件中。它已在名为DataStream.h(头文件)的文件中的类中声明。如果未执行此操作,则会出现另一个错误,说明:”对
MsgPacket::MsgPacket(int,int,int,int,int,std::string)的未定义引用
DataStream::DataStream()'| | |===构建完成:2个错误,0个警告(0分1秒)===|我也有同样的问题。谢谢你的后续回答。同样的问题。谢谢你!我也有同样的问题。谢谢你的后续回答。同样的问题。谢谢你!哈哈,这正是我的案例:)哇,好几个小时都看不到这个。哈哈,这正是我的案例:)哇,好几个小时都看不到这个。