'class'在此有一个先前的声明

时间:2012-10-03 04:08:21

标签: c++ compiler-errors g++

我不能为我的生活弄清楚什么是错的。

我的makefile:

all: main.o rsa.o
    g++ -Wall -o main bin/main.o bin/rsa.o -lcrypto

main.o: src/main.cpp inc/rsa.h
    g++ -Wall -c src/main.cpp -o bin/main.o -I inc

rsa.o: src/rsa.cpp inc/rsa.h
    g++ -Wall -c src/rsa.cpp -o bin/rsa.o -I inc

我的主要课程:

#include <iostream>
#include <stdio.h>
#include "rsa.h"

using namespace std;
int main()
{
    //RSA rsa;
    return 0;
}

我的.cpp:

#include "rsa.h"
#include <iostream>
using namespace std;

RSA::RSA(){}

我的.h:

#ifndef RSA_H
#define RSA_H

class RSA
{
    RSA();
};
#endif

我收到以下错误:

In file included from src/main.cpp:7:0:
inc/rsa.h:7:7: error: using typedef-name ‘RSA’ after ‘class’
/usr/include/openssl/ossl_typ.h:140:23: error: ‘RSA’ has a previous declaration here

我觉得我已经尝试了所有东西,但我被困住了。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

  

/usr/include/openssl/ossl_typ.h:140:23:错误:'RSA'此处有声明

在错误消息中,您似乎与OpenSSL中定义的另一个名为RSA的类有符号名称冲突。
有两种方法可以解决这个问题:

  1. 更改您的班级名称或
  2. 如果要保留相同的名称,请在命名空间中包装。

答案 1 :(得分:1)

您的编译器在ossl_typ.h文件中找到了一个RSA的typedef,在编译程序时间接#included。我至少可以想到三个解决方案:

  1. 将您的班级名称更改为其他名称。

  2. 将您的课程安排在namespace

  3. 找出构建中包含OpenSSL标头的原因。环顾四周后,我发现this Q&A表示gcc -w -H <file>会显示#included的文件。从那里,您可以删除对OpenSSL标头的依赖。