2 votes

C++ Comment corriger l'erreur de compilation de déclarations multiples ?

J'ai 2 en-têtes et un fichier 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 me donne l'erreur : error C2874 : using-declaration causes a multiple declaration of 'storage::Block'.

Est-il possible d'éviter cette erreur sans déplacer la directive using et inclure "Block.h" dans l'en-tête ?

3voto

EFenix Points 768

Le problème est que vous avez déclaré deux "Blocks". L'un se trouve dans l'espace de nom "storage" et l'autre dans l'espace de nom global. Essayez ceci :

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

2voto

molbdnilo Points 9289

Vous devez mettre la déclaration forward dans l'en-tête à l'intérieur de l'espace de nom :

namespace storage
{
    class Block; 
}

et

vector<storage::Block*> blocks_;

0voto

TonyK Points 8604

Je pense que c'est le message d'erreur qui est le problème ici. Il devrait dire :

using-declaration entraîne une déclaration multiple de 'Block'.

et non

using-declaration entraîne une déclaration multiple de 'storage::Block'.

En tout cas, votre déclaration préalable class Block; déclare Block dans l'espace de nom global, ce n'est donc pas la même classe que storage::Block . Ainsi, votre using -Directive donne deux significations à Block ce qui n'est pas autorisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X