heaedr.h部の複数コメント部のC& operator = (const D& x);を定義して int main()基底 = 派生;の挙動を変えてみよう思うい、そのコードを書いてみたのですが[xが定義されていない識別子です]や[構文エラー: ',' が '&' の前にありません]などといった意味のわからないコンパイルエラーが出るのですが原因がわからず困っています。 
1、エラーの原因と対処法を知りたい。
2、初学者のためそもそもこの行為が正しい行為なのかもわかりらずもっといい書き方がのならばそのあたりも教えてほしいです。
3,そもそもこれはやっていいのか?

////////////Header.h部///////////////////////////////////

#pragma once
#ifndef ___Header_h
#define ___Header_h
#include <iostream>
#include <String>
using namespace std;


class C {
private:
protected:

        string name;

public:

        C(string n = "no name"):name(n)
        {
                cout << "基底コンストラクタ\n";
        }

        string g_str()const
        {
                return name;
        }




        C& operator = (const C& x)
        {
                if (this != &x)
                {
                        cout << "クラスC 代入 C& operator = (const C& x)\n";
                        name = x.name;
                }

                return *this;
        }


        //C& operator = (const D& x)
        //{
        //      if (this != &x)
        //      {
        //              cout << "クラスC 代入 C& operator = (const C& x)\n";
        //              name = x.dg_name();
        //      }

        //      return *this;
        //}


        C(const C& x)
        {
                cout << "クラスC コピー C(const C& x)\n";
                if (this != &x)
                {
                        name = x.name;
                }
        }

        void print() { cout << "class C\n"; }

        virtual void view()const {
                cout << " 基底クラス name : " << name << "\n";

        }


};

class D : public C {
private:
        string name;
protected:
public:

        virtual void view()const
        {
                cout << " 派生クラス name: " << name <<"\n";
                cout << " 基底クラス name: " << C::name << "\n";
        }

        string dg_name()const
        {
                return name;
        }

        D& operator = (const D& x)
        {
                cout << "クラスD 代入 D& operator = (const D& x)\n";
                if (this != &x)
                {
                        name = x.name;
                }

                return *this;
        }

        D& operator = (const C& x)
        {
                if (this != &x)
                {
                        cout << "クラスD 代入 D& operator = (const C& x)\n";

                        C::name = x.g_str();
                }

                return *this;
        }

        D(const D& x)
        {

                if (this != &x)
                {
                        cout << "派生クラスのコピー\n";
                        name = x.name;
                }
        }

        void print() { cout << "class D\n"; }

        D(string n = "no name",string nn = "no name"):C(nn),name(n)
        {
                cout << "派生コンストラクタ\n";
        }


};



#endif

///////int main()//////////////////// 

#include <iostream>
#include "conio.h"
#include "Header.h"
using namespace std;


int main()
{
        C a("test a");
        C b("test b");
        D d1("d1 test","dd1 test");//派生、基底
        D d2("d2 test", "dd2 test");


        a = d1;//


        _getch();
        return 0;
}