2010-12-30 24 views
6

Được rồi tôi sẽ đưa ra một ví dụ đơn giản của vấn đề của tôi:Tại sao tôi không thể chuyển thông số mẫu vào mẫu khác?

void Increment(Tuple<int, int>& tuple) { 
    ++tuple.Get<0>(); 
} 

int main() { 

    Tuple<int, int> tuple; 

    tuple.Get<0>() = 8; 

    Increment(tuple); 

    printf("%i\n", tuple.Get<0>()); // prints 9, as expected 

    return 0; 

} 

này biên dịch tốt, và tất cả là peachy. Hàm Increment chỉ tăng phần tử đầu tiên trong tuple, và sau đó tôi in phần tử đó. Tuy nhiên, nó sẽ không được tốt đẹp nếu chức năng tăng trưởng của tôi có thể được sử dụng trên bất kỳ loại yếu tố?

template <typename T> 
void Increment(Tuple<T, T>& tuple) { 
    ++tuple.Get<0>(); // <-- compile ERROR 
} 

int main() { 

    Tuple<int, int> tuple; 

    tuple.Get<0>() = 8; 

    Increment<int>(tuple); 

    printf("%i\n", tuple.Get<0>()); 

    return 0; 

} 

dụ thứ hai của tôi spits ra lỗi sau tại thời gian biên dịch:

error: expected primary-expression before ')' token 

Tôi đang ở wits của tôi end cố gắng tìm ra lý do tại sao điều này gây ra vấn đề. Vì tham số mẫu là 'int', mã được tạo nên là giống hệt đối với ví dụ được mã hóa cứng của tôi. Làm cách nào tôi có thể làm việc này?

+1

Các sự xấu xa và trickiness của việc sử dụng như trong câu trả lời của GMAN có lẽ là lý do tại sao cả hai std và thúc đẩy các bộ có một miễn phí 'chức năng get': '++ được <0> (tuple); ' – UncleBens

Trả lời

11

Nó nên là:

++tuple.template Get<0>(); 

Trong cùng một cách bạn cần typename để chỉ định một loại trình độ từ một loại phụ thuộc, bạn cần template để xác định một mẫu chức năng đủ điều kiện từ một loại phụ thuộc.

+0

Làm việc rực rỡ! Tôi không thể tin sau tất cả những năm sử dụng C++ mà tôi chưa bao giờ nghe đến. Đoán tôi không sử dụng các mẫu thường đủ. Cảm ơn! – nonoitall

+0

@nonoitall: Nó ít được biết đến, vì một lý do nào đó. (Cũng bởi vì nhiều người sử dụng NSVC, ​​và nó hoạt động mà không có nó, vì vậy mọi người không bao giờ gặp phải vấn đề ở nơi đầu tiên.) – GManNickG

+0

@Gman: Vâng, đó là bởi vì MSVC không yêu cầu nó. – Puppy

4

Vì GMan đã cung cấp cho bạn chính xác answer, một điều bạn vẫn có thể làm là: bạn chỉ cần viết Increment(tuple) thay vì Increment<int>(tuple) (cú pháp sau trông hơi phức tạp). Trình biên dịch đủ thông minh để suy ra hàm chức năng -mẫu từ loại của tuple.

Xem này: http://www.ideone.com/juNOg

+0

Tốt cho một bình luận. Tôi nghi ngờ đó là một nắm giữ từ anh ta kiểm tra ra những thứ khác nhau để làm cho nó hoạt động. – GManNickG

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