Câu hỏi này có liên quan đến số one cuối cùng của tôi. Tôi đang cố giải quyết vấn đề bằng cách sử dụng traits<T>
và traits<T*>
. Vui lòng xem xét mã sau đây.Sử dụng các đặc điểm trong C++
template<typename T>
struct traits
{
typedef const T& const_reference;
};
template<typename T>
struct traits<T*>
{
typedef const T const_reference;
};
template<typename T>
class test
{
public:
typedef typename traits<T>::const_reference const_reference;
test() {}
const_reference value() const {
return f;
}
private:
T f;
};
int main()
{
const test<foo*> t;
const foo* f = t.value(); // error here. cannot convert ‘const foo’ to ‘const foo*’ in initialization
return 0;
}
Vì vậy, nó trông giống như trình biên dịch không được xem xét đặc điểm chuyên môn cho con trỏ và tham kiểu trả về của value()
như const foo
hơn const foo*
. Tôi làm gì sai ở đây?
Mọi trợ giúp sẽ tuyệt vời!
Tôi cảm thấy đổ: (Nhưng, T chính nó là một con trỏ ('foo *'). Vì vậy, chỉ định 'T *' sẽ dẫn vào 'T **'? –
Không. Trong đặc điểm 'đặc điểm', 'T 'không phải là một con trỏ,' T * 'là một con trỏ.Đó là bạn sử dụng cùng một tham số kiểu tên là không quan trọng .. –
outis
OK. –