我有一个运行GCC 4.8.5的CentOS 7安装,我可以成功编译一个名为MyClass的cpp文件。我使用以下命令编译文件:
g++ -c -fpermissive $(pkg-config --cflags --libs libavformat libavcodec libswscale libavutil) ./MyClass.cpp
当我在运行GCC 4.4.7的Centos 6.7上运行此命令时,出现以下错误:
In file included from ./MyClass.cpp:9:
./MyClass.h:70: warning: ISO C++ forbids initialization of member ‘pFormatCtx’
./MyClass.h:70: warning: making ‘pFormatCtx’ static
./MyClass.h:70: error: invalid in-class initialization of static data member of non-integral type ‘AVFormatContext*’
在我的MyClass.h文件中,我有一个私有变量:
AVFormatContext *pFormatCtx = NULL;
对于我初始化为NULL的任何私有变量,都会重复此错误。
我的两个CentOS安装之间遇到的差异是否有解释?
这是完整的课程:
//
// MyClass.h
// FFMpegPlayground
//
#ifndef __FFMpegPlayground__MyClass__
#define __FFMpegPlayground__MyClass__
#include <stdio.h>
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
#ifdef __cplusplus
#define __STDINT_MACROS
#endif
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavutil/frame.h>
}
typedef enum {
K_STATUS_OK = 0,
K_CANT_OPEN_FILE = -1,
K_NO_STREAM_INFO = -2,
K_NO_VIDEO_STREAM = -3,
K_CODEC_UNSUPPORTED = -4,
K_CANT_COPY_CODEC = -5,
K_CANT_OPEN_CODEC = -6,
K_CANT_ALLOCATE_FRAME = -7,
K_SEEK_FAILED = -8,
K_UNABLE_TO_ACQUIRE_FRAME = -9
} MyClassStatus;
class MyClass{
public:
MyClass();
MyClass(const char * filePath);
MyClass(const char * filePath, double nScale);
~MyClass();
MyClassStatus getStatus();
void seekToFrame(int frame);
uint8_t* frameData();
uint8_t* nextFrameData();
uint8_t* copyOfNextFrameData();
int getFrameHeight();
int getFrameWidth();
int getCurrentFrame();
int getFrameDataSize();
long long getNumberOfFrames();
private:
bool fileIsLoaded;
uint8_t* createFrame();
int currentFrame;
void internalSeekToFrame(int frame);
MyClassStatus status;
AVFormatContext *pFormatCtx = NULL;
int i, videoStream;
AVCodecContext *pCodecCtxOrig = NULL;
AVCodecContext *pCodecCtx = NULL;
AVCodec *pCodec = NULL;
AVFrame *pFrame = NULL;
AVFrame *pFrameRGB = NULL;
int numBytes;
uint8_t *buffer = NULL;
struct SwsContext *sws_ctx = NULL;
uint8_t *_createdFrameData = NULL;
double preferredScale = 1.0;
};
#endif /* defined(__FFMpegPlayground__MyClass__) */
答案 0 :(得分:2)
非静态成员的类内初始化程序,如
AVFormatContext *pFormatCtx = NULL;
是C ++ 11的一项功能。 gcc4.4太旧了。