2010-08-17 41 views
34

Mã này biên dịch và làm việc như mong đợi (nó ném lúc chạy, nhưng đừng bận tâm):C++ template biên soạn lỗi: dự kiến ​​ban đầu thể hiện trước '>' dấu hiệu

#include <iostream> 
#include <boost/property_tree/ptree.hpp> 

void foo(boost::property_tree::ptree &pt) 
{ 
    std::cout << pt.get<std::string>("path"); // <--- 
} 

int main() 
{ 
    boost::property_tree::ptree pt; 
    foo(pt); 
    return 0; 
} 

Nhưng ngay sau khi tôi thêm các mẫu và thay đổi mẫu foo vào

template<class ptree> 
void foo(ptree &pt) 

tôi nhận được một lỗi trong GCC:

test_ptree.cpp: In function ‘void foo(ptree&)’: 
test_ptree.cpp:7: error: expected primary-expression before ‘>’ token 

nhưng không có lỗi với MSVC++! Lỗi nằm trong dòng được đánh dấu <---. Và một lần nữa, nếu tôi thay đổi dòng sự cố thành

--- std::cout << pt.get<std::string>("path"); // <--- 
+++ std::cout << pt.get("path", "default value"); 

lỗi biến mất (sự cố rõ ràng là <std::string>).

Boost.PropertyTree yêu cầu Tăng> = 1,41. Hãy giúp tôi hiểu và sửa lỗi này.


Xem Templates: template function not playing well with class’s template member function - một câu hỏi phổ biến tương tự có chứa câu trả lời tốt khác và giải thích.

+1

liên quan: http://stackoverflow.com/questions/1682844/ template-template-function-not-playing-well-với-class-template-member-functi/1682885 (Nhân bản?) – GManNickG

+1

Có, nó là một bản sao. Cảm ơn sự giúp đỡ của bạn! –

Trả lời

47

Bạn cần phải làm:

std::cout << pt.template get<std::string>("path"); 

Sử dụng template trong tình cảnh tương tự như typename, ngoại trừ cho các thành viên template thay vì các loại.

(Tức là, kể từ pt::get là một mẫu thành viên phụ thuộc trên một tham số mẫu, bạn cần phải nói với trình biên dịch đó là một mẫu.)

+0

Rất đẹp. Bạn có một tài nguyên cụ thể mà bạn sử dụng để sử dụng mẫu không? Tôi hỏi tò mò. Không có sách nào của tôi dường như giải quyết vấn đề này. – Chance

+0

@Chance: Tôi không, thật đáng buồn, mặc dù bạn có thể tìm thấy một trong những [danh sách này] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), cụ thể là * Mẫu C++, Hướng dẫn hoàn chỉnh *. – GManNickG

+2

Tại sao bạn cần phải nói với trình biên dịch đó là một mẫu? Không nên trình biên dịch có thể hình dung ra nó? – HelloGoodbye

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