C++如何修复多声明编译器错误

C++ How to fix multiple declaration compiler error

本文关键字:编译器 错误 声明 何修复 C++      更新时间:2023-10-16

我有两个头和一个cpp文件。Block.h:

    #ifndef BLOCK_H
    #define BLOCK_H
    namespace storage {
    class Block {
    };
    } // namespace storage
    #endif // BLOCK_H

PerformanceWriteTest.h

    #ifndef _PERFORMANCE_WRITE_TEST_
    #define _PERFORMANCE_WRITE_TEST_
    #include <string>
    #include <vector>
    using std::vector;
    class Block;  // <<< Forward declaration of Block
    class PerformanceWriteTest {
      vector<Block*> blocks_;
    public:
      virtual ~PerformanceWriteTest();
    };
    #endif

性能写入测试.cpp

    #include "Block.h"
    #include "PerformanceWriteTest.h"
    using storage::Block; // <<< Use the scope storage::Block. Error!
    PerformanceWriteTest::~PerformanceWriteTest() {
      for (Block* block : blocks_) {
        delete block;
      }
    }

Visual Studio 2012出现错误:错误C2874:使用声明导致"storage::Block"的多重声明

是否可以在不移动using指令并将"Block.h"包括在标头中的情况下避免此错误?

问题是您声明了两个"块"。一个在命名空间"storage"中,另一个在全局命名空间中。试试这个:

namespace storage {
    class Block;  // <<< Forward declaration of Block
}
class PerformanceWriteTest {
   vector<storage::Block*> blocks_;
 public:

您需要将forward声明放在名称空间内的头中:

namespace storage
{
    class Block; 
}

vector<storage::Block*> blocks_;

我认为这里的问题是错误消息。应该说:

使用声明会导致"Block"的多次声明

而不是

使用声明会导致"storage::Block"的多重声明

在任何情况下,前向声明class Block;在全局命名空间中声明Block,因此它与storage::Block不是同一个类。因此,您的using-指令为Block提供了两种含义,这是不允许的。