2012-03-23 37 views
7

Tôi đang gặp khó khăn với mã sau đây. Về cơ bản, tôi có một lớp Foo và thanh lớp lồng nhau, và bây giờ tôi muốn chuyển một con trỏ của đối tượng lớp Bar tới một hàm, nhưng nó không biên dịch. ai có thể giúp tôi việc này không? Cảm ơn bạn.Chức năng mẫu C++ lấy lớp mẫu làm tham số

template <typename T> 
struct Foo 
{ 
    struct Bar 
    { 
     T data_; 
    }; 
    Bar bar_; 
}; 

template <typename T> 
void func(Foo<T>::Bar* bar) // Why is this line wrong??? 
{ 
} 

int main() 
{ 
    Foo<int> foo; 
    foo.bar_.data_ = 17; 
    func(&foo.bar_); 
    return 0; 
} 
+0

có thể trùng lặp của [C++, đối số mẫu không thể được suy luận] (http://stackoverflow.com/questions/6060824/c-template-argument-can -Không được suy luận) –

+0

(ít nhất, một bản sao một khi giải quyết vấn đề 'typename' rõ ràng, mà VC++ có lẽ sẽ để trượt như bình thường anyway) –

Trả lời

14

Bạn cần có chữ ký sau

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Why is this line wrong??? 

Tuy nhiên, đó không phải là vấn đề duy nhất

func(&foo.bar_); 

cũng cần phải

func<int>(&foo.bar_); 

Điều này là do bạn đang gọi chức năng templated "func" nhưng không thể suy ra loại của nó. Không có loại của nó, nó sẽ cung cấp một lỗi như

no matching function for call to 'func(Foo<int>::Bar*)' 
+2

+1. Câu trả lời chính xác. Vấn đề lớn hơn là: 'T' không thể được suy ra, vì vậy nó cần phải được thông qua một cách rõ ràng. – Nawaz

+2

+1 Tôi thích những người mới đến đưa ra câu trả lời "sâu"! FYI thực tế là 'T' không thể được suy luận ở đây được gọi là ** bối cảnh không thể suy diễn **. –

3

Đó là một dependent name, bạn cần phải nói:

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Tell the compiler explicitly it's a type 
+2

Downvoter chăm sóc để bình luận? – Flexo

+0

-1. Câu trả lời này không đầy đủ và không giải quyết được vấn đề lớn hơn trong câu hỏi. Những gì bạn nói là đúng, nhưng cách 'func (& foo.bar_)' hoạt động như thế nào? Nó vẫn sẽ không. – Nawaz

+0

@ Nawaz: Vui lòng xem câu trả lời của tôi – josephthomas

Các vấn đề liên quan