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

时间:2016-07-21 20:30:45

标签: c++ c++11 visual-studio-2012

我有2个标题和1个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

PerformanceWriteTest.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:using-declaration导致多次声明&lt; storage :: Block&#39;

是否可以在不移动using指令的情况下避免此错误并包含&#34; Block.h&#34;标题?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

namespace storage
{
    class Block; 
}

vector<storage::Block*> blocks_;

答案 2 :(得分:0)

我认为这是错误信息,这是问题所在。它应该说:

  

using-declaration会导致多次声明'Block'

而不是

  

using-declaration会导致'storage :: Block'的多重声明

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