2011-12-20 38 views
6

Mã C++ sau có đúng không? Và nếu có, ai có thể chỉ cho tôi một đoạn trong tiêu chuẩn đề cập đến điều này? Dường như người ta có thể sử dụng tên mẫu thay vì mẫu-id trong một phạm vi kèm theo mẫu và trình biên dịch sẽ tự động thêm danh sách đối số mẫu.Sử dụng tên mẫu thay cho mẫu-id bên trong định nghĩa mẫu lớp

template<class Type> 
class Mana { 
public: 
    Mana(const Mana& m) {/*...*/} 
    Mana() {/*...*/} 
}; 

như trái ngược với:

template<class Type> 
class Mana { 
public: 
    Mana(const Mana<Type>& m) {/*...*/} 
    Mana() {/*...*/} 
}; 

mã biên dịch với g ++ cũng như trong MS visual studio.

+1

Mã đúng. 'Mana' tương đương với' Mana '. Đối với báo giá từ tiêu chuẩn, chúng ta cần phải chờ đợi. – iammilind

Trả lời

7

Có mã đúng. (Các quote: §14.6.1 [temp.local]/2

Trong phạm vi của một lớp mẫu chuyên môn hoặc chuyên môn hóa một phần, khi tiêm-class-name là sử dụng như một loại- tên, nó tương đương với các mẫu tên tiếp theo là mẫu-luận của lớp mẫu chuyên môn hoặc chuyên môn hóa một phần đính kèm trong <> [Ví dụ:.

template<template<class> class T> class A { }; 
template<class T> class Y; 
template<> class Y<int> { 
    Y* p;  // meaning Y<int> 
    Y<char>* q; // meaning Y<char> 
    A<Y>* a;  // meaning A<::Y> 
    class B { 
     template<class> friend class Y; // meaning ::Y 
    }; 
}; 

-cuối dụ]

)

Trong thực tế này được sử dụng trên tất cả các nơi trong tiêu chuẩn là tốt, ví dụ

// §20.4.2.1[tuple.cnstr]/10-13 
tuple(const tuple& u) = default; 
tuple(tuple&& u) = default; 

// §21.4.6.1[string::op+=]/1-2 
basic_string& operator+=(const basic_string& str); 

// etc. 
Các vấn đề liên quan