Observation: the codes pasted below were tested only with GCC 4.4.1, and I'm only interested in them working with GCC.
Object xây dựng/Forward khai báo hàm mơ hồ
Xin chào,
Đó là không chỉ một vài lần mà tôi vấp vào một tuyên bố xây dựng đối tượng mà tôi không hiểu, và nó là chỉ ngày hôm nay tôi nhận thấy sự mơ hồ nào được giới thiệu bởi nó. Tôi sẽ giải thích làm thế nào để tái sản xuất nó và muốn biết nếu có một cách để sửa chữa nó (C++ 0x cho phép). Nó đi từ đây.
Giả sử có một lớp mà hàm tạo chỉ nhận một đối số và loại đối số của một đối số này là một lớp khác với hàm tạo mặc định. Ví dụ:
struct ArgType {};
class Class
{
public:
Class(ArgType arg);
};
Nếu tôi cố gắng xây dựng một đối tượng kiểu Class
trên stack, tôi nhận được một sự mơ hồ:
Class c(ArgType()); // is this an object construction or a forward declaration
// of a function "c" returning `Class` and taking a pointer
// to a function returning `ArgType` and taking no arguments
// as argument? (oh yeh, loli haets awkward syntax in teh
// saucecode)
tôi nói nó là một xây dựng đối tượng, nhưng trình biên dịch khẳng định đó là một lời tuyên bố về phía trước bên trong thân hàm. Đối với những người vẫn không hiểu, đây là ví dụ hoàn toàn làm việc:
#include <iostream>
struct ArgType {};
struct Class {};
ArgType func()
{
std::cout << "func()\n";
return ArgType();
}
int main()
{
Class c(ArgType());
c(func); // prints "func()\n"
}
Class c(ArgType funcPtr()) // Class c(ArgType (*funcPtr)()) also works
{
funcPtr();
return Class();
}
Vì vậy, đủ ví dụ. Bất cứ ai cũng có thể giúp tôi vượt qua điều này mà không làm bất cứ điều gì quá chống thành ngữ (tôi là một nhà phát triển thư viện và những người như thư viện thành ngữ)?
- chỉnh sửa
Không sao. Đây là bản dupe của Most vexing parse: why doesn't A a(()); work?.
Xin cảm ơn, sbi.
Mã của bạn biên dịch cho tôi với g ++ - đó chút nào bạn nghĩ rằng không nên làm việc? –
Nó không phải là vấn đề làm việc hay không hoạt động. Vấn đề là tôi chỉ muốn xây dựng một đối tượng kiểu 'Class' và truyền hàm tạo của nó một đối tượng kiểu' ArgType' được xây dựng bên trong .. Nhưng nó nhận ra như một khai báo chuyển tiếp. Tôi sẽ thêm mã mà tôi muốn làm việc nhưng không thể, chỉ một giây. –
Quên đi, Neil. Nhìn vào câu trả lời của sbi, đó chính là vấn đề của tôi. –