Xin chào và chúc bạn một ngày tốt lành.C++: buộc biên dịch mẫu hoàn chỉnh (MSVC/G ++)
Tiếp theo đoạn mã biên dịch trên cl.exe (15.00.30729.01) và mingw-g ++ (4.4.0):
template<typename T> class Test{
public:
T t;
void error(){
int doesNotExist = 6;
return doesNotExist;//<---- void function returning result
}
};
int main(int argc, char** argv){
Test<int> test;
return 0;
}
Ngoài ra, trên cl.exe bạn thậm chí có thể nhận được ngay với một cái gì đó như thế này:
template<typename T> class Test{
public:
T t;
void error(){
doesNotExist = 6;//<---- undeclared variable
return doesNotExist;//<---- void function returning result
}
};
Bây giờ, điều này rõ ràng xảy ra vì trình biên dịch không tạo nội dung cho các phương thức của lớp mẫu cho đến khi ai đó gọi cho họ. Tuy nhiên, điều này có thể gây ra vấn đề khi bạn thiết kế lớp mẫu lớn (vì bạn rất có khả năng quên thêm lời gọi thử vào phương thức mới ở đâu đó).
Câu hỏi đặt ra:
Có một switch trình biên dịch cho g ++ hoặc cl.exe mà sẽ buộc trình biên dịch để xử lý toàn bộ mẫu (do đó, mã đoạn này sẽ kích hoạt lỗi biên dịch)?
Đúng, bản mô tả mẫu rõ ràng là những gì bạn muốn. Xem thêm: http://msdn.microsoft.com/en-us/library/by56e477%28VS.80%29.aspx –
Giải thích tốt về mục đích thực sự không có lỗi trình biên dịch. – iammilind
Ok, nó hoạt động. Tôi chấp nhận câu trả lời của bạn, nhưng nó không thực sự cần thiết để giải thích TẠI SAO nó hoạt động theo cách này (tôi đã biết). Cảm ơn vi đa trả lơi. – SigTerm