Giả sử tôi có một số lớp:Tôi có thể tạo mẫu chữ do người dùng xác định không?
template <typename T>
class Foo {
const T* x_;
public:
Foo(const T* str) : x_{str} {}
};
và tôi cung cấp một số literals người dùng định nghĩa để tạo ra một đối tượng Foo
:
Foo<char> operator"" _foo(const char* str, std::size_t) {
return Foo<char>{str};
}
Foo<wchar_t> operator"" _foo(const wchar_t* str, std::size_t) {
return Foo<wchar_t>{str};
}
// etc. for char16_t and char32_t.
Câu hỏi của tôi là thế này: tại sao tôi không thể template này và tiết kiệm có viết lại mã?
template <typename T>
Foo<T> operator"" _foo(const T* str, std::size_t) {
return Foo<T>{str};
}
gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.4) và 7.0.0 (biên soạn bản thân mình) báo cáo:
nhắnerror: ‘Foo<T> operator""_foo(const T*, std::size_t)’ has invalid argument list
Foo<T> operator"" _foo(const T* str, std::size_t) {
^
Các lỗi có vẻ là đủ rõ ràng, nhưng Tôi không thấy lý do tại sao tôi không được phép làm điều này theo nguyên tắc; vì vậy, tôi đang làm điều này không chính xác, hoặc là điều này thực sự không được phép?
2.14.8/3 gợi ý mẫu nhà điều hành do người dùng định nghĩa là hợp lệ. Per/5, mã của bạn dường như, với tôi, là chính xác. Trình biên dịch của bạn không chọn chuyên môn của toán tử mẫu (cụ thể) một toán tử _string_ literal do người dùng định nghĩa và mẫu fu của tôi không đủ tốt để tìm hiểu xem đây có phải là lỗi hay do các quy tắc tra cứu. –
@LightnessRacesinOrbit Tôi đoán [over.literal] là phù hợp hơn ở đây. Dường như một mẫu chức năng liên quan đến id toán tử theo nghĩa đen phải tuân theo một khai báo cố định (nhiều hơn hoặc ít hơn 'mẫu« toán tử kép "" _x() '). Không có hình thức nào khác được cho phép. –
skypjack
@skypjack: Các từ ngữ làm cho tôi đề nghị thử nó với một instantiation rõ ràng. –