C ++ 11 Delegate Constructor พร้อมพารามิเตอร์อินสแตนซ์ใหม่?

มีปัญหาในการคอมไพล์ไวยากรณ์นี้โดยใช้ Visual Studio พฤศจิกายน 2555 CTP C++ Compiler ... แค่ต้องการให้แน่ใจว่าฉันไม่ได้พลาดสิ่งที่ชัดเจน

ขอบคุณ!

แก้ไข: ลบส่วนหัวออกเพื่อให้ง่ายยิ่งขึ้น

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 แหล่งที่มา
comment
หากเป็นข้อผิดพลาดภายในในคอมไพเลอร์ นั่นหมายความว่าคอมไพเลอร์เกิดความสับสน ไม่ใช่โค้ดของคุณ ดูเหมือนว่าฉันว่ามันถูกต้อง คุณอาจต้องการยื่นรายงานข้อผิดพลาดที่ MSDN   -  person Seth Carnegie    schedule 17.01.2013
comment
ข้อผิดพลาดภายในไม่ควร ไม่ เกิดขึ้น หากเป็นเช่นนั้น แสดงว่าคอมไพเลอร์ถือเป็นจุดบกพร่องเสมอ และไม่ใช่ความผิดของคุณ   -  person Kerrek SB    schedule 17.01.2013
comment
ในฐานะที่เป็น sidenote/pet peeve การใช้ void เพื่อระบุว่าฟังก์ชันไม่มีการโต้แย้ง... AUGH!   -  person Nik Bougalis    schedule 17.01.2013
comment
คุณยังลืมอัฒภาคทั้งหมด บางทีคอมไพเลอร์ของคุณอาจโกรธคุณและต้องการให้คุณปล่อยมันไว้ตามลำพัง   -  person Kerrek SB    schedule 17.01.2013
comment
ฉันเดาว่านี่ไม่ใช่รหัสจริง ไม่มีอัฒภาค ไม่มีการประกาศไปข้างหน้า ฯลฯ   -  person billz    schedule 17.01.2013
comment
@ Kerrek ขออภัยใช่แล้ว .. ฉันพยายามทำให้ง่ายขึ้น .. ฉันแก้ไขมันแล้ว :หน้า   -  person e.s. kohen    schedule 17.01.2013
comment
สิ่งหนึ่งที่ควรลองคือมองหาเครื่องหมายอัฒภาคที่หายไปในโค้ดจริงของคุณ ฉันมีคอมไพเลอร์ปี 2012 (ไม่ใช่ CTP) ที่จะขัดข้องด้วยข้อผิดพลาดภายในเมื่อฉันพลาดองค์ประกอบทางวากยสัมพันธ์ในคำจำกัดความเทมเพลตที่ซับซ้อน   -  person Peter Ruderman    schedule 17.01.2013
comment
@SethCarnegie ฉันดูที่ Connect เพื่อดูว่ามีวิธีใดบ้าง แต่ฉันไม่พบผลิตภัณฑ์ คุณมีข้อเสนอแนะใด ๆ ?   -  person e.s. kohen    schedule 17.01.2013
comment
@PeterRuderman ฉันรู้ว่ามันไม่ได้ขาดอัฒภาคเนื่องจากโค้ดคอมไพล์และทำงานได้ดีเมื่อฉันไม่รวมไวยากรณ์สำหรับการมอบหมายคอนสตรัคเตอร์ (เว้นแต่ว่าไวยากรณ์นั้นต้องใช้อัฒภาคที่ฉันไม่รู้) สิ่งนี้ใช้ได้กับ GCC หรือไม่ ถอนหายใจ ฉันต้องติดตั้ง gcc อีกครั้ง   -  person e.s. kohen    schedule 17.01.2013


คำตอบ (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() {}

โค้ดด้านบนคอมไพล์และทำงานใน gcc 4.7.2

ฉันต้องทำการเปลี่ยนแปลงโค้ดของคุณเล็กน้อยจึงจะสามารถคอมไพล์ได้ เมื่อทำให้สิ่งต่าง ๆ ง่ายขึ้น พยายามคงการคอมไพล์โค้ดแบบง่ายไว้ http://sscce.org/

person Yakk - Adam Nevraumont    schedule 16.01.2013
comment
มีอะไรกับสำเนาหลายชุด? - person 0x499602D2; 17.01.2013
comment
@Yakk ฉันได้รับข้อผิดพลาดเดียวกันกับรหัสของคุณและของฉัน เนื่องจากมันใช้งานได้บน GCC และตอนนี้ฉันเพิ่งได้รับแจ้งว่าเวอร์ชันล่าสุดของคอมไพเลอร์ โพสต์ CTP คอมไพล์สิ่งนี้ได้อย่างหมดจด ฉันจะอธิบายข้อบกพร่องในคอมไพเลอร์ CTP มิฉะนั้น ดูเหมือนว่าจะเป็นไวยากรณ์ที่ถูกต้อง และฉันจะทำเครื่องหมายของคุณว่าเป็นคำตอบสำหรับการตรวจสอบว่าเป็นไวยากรณ์ C ++ 11 ที่เหมาะสม ขอบคุณ! - person e.s. kohen; 17.01.2013
comment
เพิ่มเติมใหม่: ฉันไม่สามารถนับจำนวนข้อบกพร่องต่างๆ ที่ฉันได้รับจากไวยากรณ์นี้ได้ แต่โดยปกติแล้วข้อบกพร่องทั้งหมดจะจบลงด้วยข้อผิดพลาดของคอมไพเลอร์ที่ไม่รู้จัก หรือข้อผิดพลาดที่ VS ไม่สามารถสื่อสารกับกระบวนการลูกบางอย่างได้ ฉันจัดการเพื่อคอมไพล์โดยเพิ่มใน: int x = 0; (เป็นโมฆะ) x; ในตัวสร้างของฉันแต่ละคนที่มอบหมายให้ผู้อื่น อย่าถามฉันว่าทำไมมันถึงใช้งานได้ แต่มันก็ใช้ได้ และฉันใช้มันเป็นวิธีแก้ปัญหาจนกว่าจะเปิดตัว วูดู! - person e.s. kohen; 17.01.2013