2014-07-23 17 views
5

Các mã sau biên dịch trong Visual C++ 2013 nhưng không thuộc G ++ 4.8.2:chế biến các chức năng template uninstantiated

template<class T> 
int MyFunc(T& t) 
{ 
    return static_cast<int>(CCodes::blah); 
} 

template<> 
int MyFunc(float& t) 
{ 
    return 0; 
} 

int main() { 
    float f = 10.f; 
    return MyFunc(f); 
} 

Visual C++ dường như bỏ qua chức năng mẫu chung bởi vì chỉ có sự chuyên môn hóa MyFunc<float> được sử dụng. G ++ phân tích cú pháp hàm chung và các điểm mà liệt kê CCodes chưa được xác định.

Điều gì là đúng? Hoặc là điều này được xác định thực hiện?

+0

Trong cả hai cách, mã không đúng định dạng vẫn là mã không đúng định dạng. –

+0

Vì vậy, tôi đoán câu hỏi của tôi có thể được viết lại: Đây có phải là mã không đúng định dạng không? Hoặc là trình biên dịch cho phép không phân tích các định nghĩa mẫu không được phân tích? – Tom

+0

@Tom Điều gì xảy ra nếu bạn viết 'return static_cast (CCodes :: blah);'? –

Trả lời

6

GCC là chính xác và mọi trình biên dịch khác ngoài MSVC cũng sẽ thực hiện tương tự.

Đây là lỗi chính, xuất hiện trên một lộ trình tương lai của MSVC. Đó là trong thể loại "tương lai xa". Họ sẽ phải viết lại công cụ mẫu của họ để sửa nó.

Có một dòng lập luận rằng chẩn đoán mẫu không đúng định dạng là tùy chọn, bởi vì nó thực sự là một mẫu không có sự khởi tạo đúng ngữ cảnh và không bắt buộc phải gắn cờ. Tuy nhiên,

  1. Tiêu chuẩn yêu cầu mẫu phải được phân tích cú pháp và không phân tích cú pháp phải được chẩn đoán bất kể diễn giải.
  2. Mỗi trình biên dịch khác đều đưa ra chẩn đoán, do đó, không có hiệu quả làm như vậy dẫn người dùng MSVC tạo mã không thể chuyển đổi. Khiếu nại là một ý tưởng thực sự tốt, ngay cả khi nó không được yêu cầu.
+0

Hmm, §14.6 [temp.res]/p10 nói "Nếu tên không phụ thuộc vào tham số mẫu (như được định nghĩa trong 14.6.2), thì một khai báo (hoặc tập hợp các khai báo) cho tên đó phải nằm trong phạm vi tại điểm mà tên xuất hiện trong định nghĩa mẫu ". Không giống như quy tắc "không có chuyên môn hợp lệ" chung, không có yêu cầu "không cần chẩn đoán" được đính kèm với quy tắc này. –

+0

@ T.C. Đúng. Vì C++ là một ngữ pháp nhạy cảm với ngữ cảnh (không có ngữ cảnh), nên tra cứu tên cần được thực hiện như một phần của phân tích cú pháp. Đây là một phần của ý tôi (1). – Potatoswatter

+0

Trên thực tế tình hình có phần tồi tệ hơn - bạn có nghĩa đen có thể đặt gần như bất kỳ rác trong cơ thể của một chức năng mẫu uninstantiated và trình biên dịch VC + + sẽ bỏ qua nó. Vì vậy, miễn là nó không chứa cú đúp đóng và không làm khó chịu tiền xử lý, có vẻ như nó không quan trọng. – Tom

Các vấn đề liên quan