C++ 11 Delegasi Konstruktor Dengan Parameter Instance Baru?

Mengalami masalah dalam mengkompilasi sintaksis ini menggunakan Visual Studio Nov 2012 CTP C++ Compiler ... Hanya ingin memastikan saya tidak melewatkan sesuatu yang jelas.

Terima kasih!

EDIT: Header dihapus untuk membuatnya lebih sederhana.

class Location
{
public:
    Location();
};

class Shape
{
public:
    Shape();
    Shape(Location location);
};


// Doing this by pointer works ...
// Shape::Shape(Location* location){}
// Shape::Shape() : Shape(new Location()){}

Shape::Shape(Location location)
{
}

Shape::Shape()
    : Shape(Location())
    // error C2143: syntax error: missing ';' before ':'
{
    // int x = 0;
    // (void) x;  // Added these two lines in some cases to get it to compile.
    // These two lines do nothing, but get around a compiler issue.
}

person e.s. kohen    schedule 16.01.2013    source sumber
comment
Jika ini adalah kesalahan internal pada kompiler maka itu berarti kompilernya yang kacau, bukan kode Anda. Menurut saya itu benar. Anda mungkin ingin mengajukan laporan bug di MSDN.   -  person Seth Carnegie    schedule 17.01.2013
comment
Kesalahan internal tidak boleh terjadi. Jika ya, itu selalu merupakan bug pada kompiler, dan bukan kesalahan Anda.   -  person Kerrek SB    schedule 17.01.2013
comment
Sebagai catatan tambahan/yang mengesalkan, menggunakan void untuk menunjukkan fungsi tidak memerlukan argumen... AUGH!   -  person Nik Bougalis    schedule 17.01.2013
comment
Anda juga lupa semua titik koma. Mungkin kompiler Anda marah kepada Anda dan ingin Anda membiarkannya.   -  person Kerrek SB    schedule 17.01.2013
comment
Saya kira ini bukan kode sebenarnya, titik koma hilang, tidak ada deklarasi penerusan, dll.   -  person billz    schedule 17.01.2013
comment
@Kerrek, maaf ya.. Saya mencoba menyederhanakan.. Saya memperbaikinya. :P   -  person e.s. kohen    schedule 17.01.2013
comment
Satu hal yang perlu dicoba adalah mencari titik koma yang hilang di kode asli Anda. Kompiler 2012 (bukan CTP) saya mogok karena kesalahan internal ketika saya melewatkan elemen sintaksis dalam definisi templat yang kompleks.   -  person Peter Ruderman    schedule 17.01.2013
comment
@SethCarnegie Saya mencari Connect untuk melihat apakah ada cara, tetapi saya tidak dapat menemukan produknya. Anda punya saran?   -  person e.s. kohen    schedule 17.01.2013
comment
@PeterRuderman Saya tahu titik koma tidak hilang karena kode dikompilasi dan berjalan dengan baik ketika saya tidak menyertakan sintaks untuk delegasi konstruktor, (kecuali sintaks tersebut memerlukan titik koma yang saya tidak tahu). Apakah ini berfungsi dengan GCC? Mendesah. Saya perlu menginstal gcc lagi.   -  person e.s. kohen    schedule 17.01.2013


Jawaban (1)


// .h Simplification
class Location
{
public:
  Location() {}
  Location(Location const& other) {}
};

class Shape
{
  Shape();
  Shape(Location location);
};

// How about by value or reference?
Shape::Shape(Location location)
{
}

Shape::Shape(void)
  : Shape(Location()) // error C1001: An internal error has occurred in the compiler.
{
}

int main() {}

Kode di atas dikompilasi dan dijalankan di gcc 4.7.2

Saya harus membuat beberapa perubahan pada kode Anda untuk membuatnya dapat dikompilasi. Saat menyederhanakan berbagai hal, cobalah untuk menjaga kompilasi kode yang disederhanakan. http://sscce.org/

person Yakk - Adam Nevraumont    schedule 16.01.2013
comment
Ada apa dengan banyak salinannya? - person 0x499602D2; 17.01.2013
comment
@Yakk Saya mendapatkan kesalahan yang sama persis dengan kode Anda dan kode saya. Karena ini berfungsi di GCC, dan sekarang saya baru saja diberitahu bahwa versi terbaru dari kompiler, setelah CTP mengkompilasi ini dengan bersih, saya akan menganggapnya sebagai bug di kompiler CTP. Jika tidak, tampaknya sintaksisnya valid. Dan saya akan menandai jawaban Anda sebagai jawaban untuk memvalidasi bahwa itu adalah sintaks C++ 11 yang tepat. Terima kasih! - person e.s. kohen; 17.01.2013
comment
Tambahan Baru: Saya tidak dapat menghitung jumlah bug berbeda yang saya dapatkan dengan sintaks ini, tetapi semuanya biasanya berakhir dengan kesalahan kompiler yang tidak diketahui, atau kesalahan yang VS tidak dapat komunikasikan dengan beberapa proses anak. Saya telah berhasil mengkompilasi ini dengan menambahkan: int x = 0; (batal) x; ke setiap konstruktor saya yang didelegasikan kepada orang lain. Jangan tanya saya mengapa ini berhasil, itu berhasil, dan saya menggunakannya sebagai solusi hingga rilis. Voodoo! - person e.s. kohen; 17.01.2013