Tôi đã tìm thấy trường hợp kỳ lạ này của một số mã (bên dưới) không biên dịch theo Visual Studio 2008 và tạo ra "lỗi C2872: 'Sự mơ hồ': biểu tượng mơ hồ "trên dòng 12.Lỗi biên dịch VS2008 (+?) Với chức năng templated và 'sử dụng không gian tên'
Xóa việc sử dụng namespace RequiredNamespace
trên dòng cuối cùng khắc phục lỗi, nhưng tôi hy vọng rằng việc đặt using namespace
ở cuối tệp sẽ không có hiệu lực. Nó cũng dựa trên AnotherFunction
là một hàm mẫu, vì vậy tôi hy vọng trình biên dịch sẽ tạo ra các chức năng templated trong phạm vi sai, hoặc không đặt lại danh sách các không gian tên được sử dụng trước khi làm như vậy.
Cùng mã biên dịch theo GCC.
Cả hai trình biên dịch dường như tạo mã cho TemplatedFunction
sau định nghĩa using namespace Namespace
, ít nhất là tôi có thể biết bằng cách giới thiệu lỗi và xem thứ tự chúng xuất.
namespace Ambiguity
{
class cSomeClass
{
};
template<class T>
void TemplatedFunction(T a)
{
// this is where the error occurs, the compiler thinks Ambiguity
// might refer to the class in RequiredNamespace below
Ambiguity::cSomeClass();
}
}
namespace RequiredNamespace
{
// without a namespace around this class, the Ambiguity class
// and namespace collide
class Ambiguity
{
};
}
int main()
{
// to force the templated function to be generated
Ambiguity::TemplatedFunction(4);
}
// removing this removes the error, but it shouldn't really do anything
using namespace RequiredNamespace;
Rõ ràng đây là một ví dụ chế tạo, nhưng bản gốc được chiết xuất từ một trường hợp thực tế nơi using namespace
là trong một file tự động tạo ra bởi mã bên thứ 3.
Đây có phải là lỗi trong trình biên dịch không?
là tôi hay đây thực sự là một ví dụ khó đọc, với những số nhận dạng cụ thể này? –
Đặt trước - không chỉ riêng bạn. –
Tôi làm cách nào để đơn giản hơn?Tôi đoán một phần của vấn đề là nếu quy ước đặt tên được theo sau, vấn đề sẽ không xảy ra - nếu bạn đặt trước các lớp của bạn với c ví dụ, bạn sẽ không có một lớp gọi là mơ hồ. Tôi đã tinh chỉnh nó một chút. – eAi