Domanda

I'm writing a program that includes a secondary form using C++/CLI in Visual Studio 2005. So far, I haven't progressed much due to a pair of redefinition errors that don't make much sense.

Mode.h(12) : error C2374: 'NameManipulator::check' : redefinition; multiple initialization
Mode.h(12) : see declaration of 'NameManipulator::check'
Mode.h(22) : error C2011: 'NameManipulator::Mode' : 'class' type redefinition
Mode.h(22) : see declaration of 'NameManipulator::Mode'

I've only declared each of these once, in just one namespace. One was even pre-generated by the compiler. Is there anything I can do to fix this besides starting from scratch? Any help would be much appreciated. (Code below)

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

namespace NameManipulator {
int check = 4;
/// <summary>
/// Summary for Mode
///
/// WARNING: If you change the name of this class, you will need to change the
///          'Resource File Name' property for the managed resource compiler tool
///          associated with all .resx files this class depends on.  Otherwise,
///          the designers will not be able to interact properly with localized
///          resources associated with this form.
/// </summary>
public ref class Mode : public System::Windows::Forms::Form
{
public:
    Mode(void)
    {
        InitializeComponent();
        //
        //TODO: Add the constructor code here
        //
    }

protected:
    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    ~Mode()
    {
        if (components)
        {
            delete components;
        }
    }
public: System::Windows::Forms::RadioButton^  rdoAllCaps;
public: System::Windows::Forms::RadioButton^  rdoAllLow;
public: System::Windows::Forms::RadioButton^  rdoReverse;
public: System::Windows::Forms::RadioButton^  rdoNormal;
private: System::Windows::Forms::Button^  btnOK;
protected: 

private:
    /// <summary>
    /// Required designer variable.
    /// </summary>
    System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    void InitializeComponent(void)
    {
        this->rdoAllCaps = (gcnew System::Windows::Forms::RadioButton());
        this->rdoAllLow = (gcnew System::Windows::Forms::RadioButton());
        this->rdoReverse = (gcnew System::Windows::Forms::RadioButton());
        this->rdoNormal = (gcnew System::Windows::Forms::RadioButton());
        this->btnOK = (gcnew System::Windows::Forms::Button());
        this->SuspendLayout();
        // 
        // rdoAllCaps
        // 
        this->rdoAllCaps->AutoSize = true;
        this->rdoAllCaps->Location = System::Drawing::Point(12, 12);
        this->rdoAllCaps->Name = L"rdoAllCaps";
        this->rdoAllCaps->Size = System::Drawing::Size(75, 17);
        this->rdoAllCaps->TabIndex = 0;
        this->rdoAllCaps->Text = L"ALL CAPS";
        this->rdoAllCaps->UseVisualStyleBackColor = true;
        // 
        // rdoAllLow
        // 
        this->rdoAllLow->AutoSize = true;
        this->rdoAllLow->Location = System::Drawing::Point(12, 35);
        this->rdoAllLow->Name = L"rdoAllLow";
        this->rdoAllLow->Size = System::Drawing::Size(63, 17);
        this->rdoAllLow->TabIndex = 1;
        this->rdoAllLow->Text = L"all lower";
        this->rdoAllLow->UseVisualStyleBackColor = true;
        this->rdoAllLow->CheckedChanged += gcnew System::EventHandler(this, &Mode::rdoAllLow_CheckedChanged);
        // 
        // rdoReverse
        // 
        this->rdoReverse->AutoSize = true;
        this->rdoReverse->Location = System::Drawing::Point(12, 58);
        this->rdoReverse->Name = L"rdoReverse";
        this->rdoReverse->Size = System::Drawing::Size(71, 17);
        this->rdoReverse->TabIndex = 2;
        this->rdoReverse->Text = L"rEVERSE";
        this->rdoReverse->UseVisualStyleBackColor = true;
        this->rdoReverse->CheckedChanged += gcnew System::EventHandler(this, &Mode::rdoReverse_CheckedChanged);
        // 
        // rdoNormal
        // 
        this->rdoNormal->AutoSize = true;
        this->rdoNormal->Checked = true;
        this->rdoNormal->Location = System::Drawing::Point(12, 81);
        this->rdoNormal->Name = L"rdoNormal";
        this->rdoNormal->Size = System::Drawing::Size(73, 17);
        this->rdoNormal->TabIndex = 3;
        this->rdoNormal->TabStop = true;
        this->rdoNormal->Text = L"rdoNormal";
        this->rdoNormal->UseVisualStyleBackColor = true;
        // 
        // btnOK
        // 
        this->btnOK->DialogResult = System::Windows::Forms::DialogResult::OK;
        this->btnOK->Location = System::Drawing::Point(32, 106);
        this->btnOK->Name = L"btnOK";
        this->btnOK->Size = System::Drawing::Size(33, 23);
        this->btnOK->TabIndex = 4;
        this->btnOK->Text = L"OK";
        this->btnOK->UseVisualStyleBackColor = true;
        // 
        // Mode
        // 
        this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
        this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
        this->ClientSize = System::Drawing::Size(99, 138);
        this->ControlBox = false;
        this->Controls->Add(this->btnOK);
        this->Controls->Add(this->rdoNormal);
        this->Controls->Add(this->rdoReverse);
        this->Controls->Add(this->rdoAllLow);
        this->Controls->Add(this->rdoAllCaps);
        this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
        this->Name = L"Mode";
        this->StartPosition = System::Windows::Forms::FormStartPosition::CenterParent;
        this->Text = L"Mode";
        this->Load += gcnew System::EventHandler(this, &Mode::Mode_Load);
        this->ResumeLayout(false);
        this->PerformLayout();

    }
#pragma endregion
private: System::Void rdoReverse_CheckedChanged(System::Object^  sender, System::EventArgs^  e){
             if (rdoReverse->Checked == true)
                 check = 3;
         }
private: System::Void Mode_Load(System::Object^  sender, System::EventArgs^  e) {
         }
private: System::Void rdoAllLow_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {
         }
};
}
È stato utile?

Soluzione

You error is that you define the check variable in the header file:

namespace NameManipulator {
    int check = 4;
    // Error in the line above

Change it to a declaration, as this:

namespace NameManipulator {
    extern int check;

and add the definition in a source file:

int NameManipulator::check = 4;

Altri suggerimenti

When you are using several modules (files of .h and .cpp) redefinition errors may occus for simple things such as a typo. The mistake I had was the following:

#ifndef NAMESPACE_FILENAME_H
#define NAMESPACE_FILEMANE_H
#include <iostream>
#include "helperFile.h"


/* you code and stuff here  */

#endif

We use the #ifndef and #endif so the compiler can ignore multiple declaration on different files and only have 1 instance of definition. Now if you go back to the second line of my declarations. I made a typo fileMane instead of filename. The compiler will through so many erorrs except for this in ur way. So yeah look out for typos!

PS: lesson cost: 5 hrs of going through my code with a fine tooth comb.

Visual Studio 2019 Community

Having Enable Unity (JUMBO) Build set to YES can also cause this error to occur if multiple project source files have global variables with the same name.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top