Tôi đã viết một thư viện nhỏ có sử dụng rất nhiều C++ 11 kỹ thuật lập trình meta và CRTP, và nó biên dịch tốt với g ++ 4.7.2Clang và Intel không biên dịch mã CRTP này
Bây giờ, tôi cố gắng biên dịch nó với Intel icpc 13.0.0.079 và nó tạo ra hàng trăm lỗi. Vì vậy, tôi cố gắng tách biệt các vấn đề này với nhau.
Vì vậy, trước hết, hãy xem xét mã này, mà biên dịch không có vấn đề dưới g ++ 4.7.2
#include <iostream>
template<template<typename> class Crtp, typename Type>
struct Base {};
template<typename Type>
struct Derived : public Base<Derived, Type>
{
Derived(): Base<Derived, Type>() {;}
};
int main()
{
Derived<int> x;
return 0;
}
Cả ICPC và kêu vang thất bại để biên dịch mã này:
test_crtp.cpp(26): error: type "Derived<Type>::Derived" is not a class template
Derived(): Base<Derived, Type>() {;}
^
test_crtp.cpp(26): error: "Base" is not a nonstatic data member or base class of class "Derived<int>"
Derived(): Base<Derived, Type>() {;}
^
detected during instantiation of "Derived<Type>::Derived() [with Type=int]" at line 31
compilation aborted for test_crtp.cpp (code 2)
Vì vậy, nó là một lỗi trong intel và clang, hoặc trong g ++? Nếu nó trong intel và clang, bạn có nghĩ rằng nó sẽ được giải quyết trong một phiên bản tương lai?
Đó là một câu hỏi hay, nhưng thường CRTP không bận tâm với tham số mẫu-template, nhưng chỉ có lớp Derived vượt qua loại. 'template struct Base; mẫu struct Có nguồn gốc: Cơ sở < Derived> {...}; 'bình thường hơn. –
... nếu bạn muốn truyền 'Type', có thể bạn có thể có' typedef' trong 'Derived' để hiển thị nó ... – Nim
Tên định danh' Derived', bên trong lớp riêng của nó, kiểu hoàn chỉnh 'Có nguồn gốc '.Đây được gọi là tên lớp * được tiêm *. Tôi nghĩ rằng đây là một lỗi với GCC. –
Xeo