我有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;标题?
答案 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
两个含义,这是不允许的。