Nếu tôi tạo thành một thành viên trỏ đến cơ sở, tôi có thể chuyển đổi thành thành viên con trỏ đến thành phần thường, nhưng không được sử dụng trong mẫu như Buzz bên dưới, nơi đối số mẫu đầu tiên ảnh hưởng đến đối số thứ hai. Tôi có đang chiến đấu với lỗi trình biên dịch hay không tiêu chuẩn thực sự ủy nhiệm điều này không hoạt động?Tại sao tôi không thể chuyển con trỏ xuống thành viên trong đối số mẫu?
struct Foo
{
int x;
};
struct Bar : public Foo
{
};
template<class T, int T::* z>
struct Buzz
{
};
static int Bar::* const workaround = &Foo::x;
int main()
{
// This works. Downcasting of pointer to members in general is fine.
int Bar::* y = &Foo::x;
// But this doesn't, at least in G++ 4.2 or Sun C++ 5.9. Why not?
// Error: could not convert template argument '&Foo::x' to 'int Bar::*'
Buzz<Bar, &Foo::x> test;
// Sun C++ 5.9 accepts this but G++ doesn't because '&' can't appear in
// a constant expression
Buzz<Bar, static_cast<int Bar::*>(&Foo::x)> test;
// Sun C++ 5.9 accepts this as well, but G++ complains "workaround cannot
// appear in a constant expression"
Buzz<Bar, workaround> test;
return 0;
}
Chắc chắn đúng, nhưng bất kỳ ý tưởng nào tại sao nó không được phép? Có vẻ tùy ý. –
@ Joseph: Tôi nghĩ nó cũng vậy, đó là lý do tại sao tôi cũng kiểm tra C++ 0x. (Họ đã xóa nhiều quyết định dường như tùy tiện, như không có tham số mẫu mặc định cho mẫu chức năng.) Không ai tìm thấy cách sử dụng cho nó và do đó nó không thực sự thay đổi/vì vậy nó không được đẩy (dễ dàng hơn để thêm giếng) tính năng thử nghiệm hơn là không dùng tính năng bị hỏng) hoặc có một số lý do cơ bản mà tôi không thể thấy. – GManNickG