2015-08-19 16 views
5

Tôi đã thay đổi một paremeter trong một hàm để chấp nhận bất kỳ loại đối tượng nào bằng cách sử dụng mẫu nhưng tôi không thể sử dụng nó cùng với các tham số mặc định khác, có điều gì đó tôi bị thiếu không?Tại sao tôi không thể có mẫu và đối số mặc định?

#include <string> 
#include <iostream> 

class MyClass { 
    public: 
    std::wstring msg = L"hey"; 
    MyClass(){}; 
}; 

class MyClass2{ 
    public: 
    template<class T> MyClass2(T* t, int i); 
}; 
template<class T> 
MyClass2::MyClass2(T* t,int i=0){ std::wcout << t->msg << std::endl; } 

int main(int argc, char **argv) 
{ 
    MyClass mc; 
    MyClass2 mc2(&mc); 
    return 0; 
} 

Output:

practice.cpp:16:32: error: redeclaration of 'MyClass2::MyClass2(T*, int)' may not have default arguments [-fpermissive] 

Tôi nghĩ đó là hợp lý để không sử dụng các giá trị mặc định trong mẫu nhưng có một lý do để các thông số khác?

Trả lời

17

Bạn chắc chắn can; đặt đối số mặc định vào khai báo chứ không phải định nghĩa.

Đưa mặc định trong danh sách đối số của định nghĩa thay vì tuyên bố là một bổ sung thêm mà không có sẵn cho chức năng mẫu:

[C++14: 8.3.6/4]: Đối với các hàm không mẫu, lập luận mặc định có thể được thêm vào trong tờ khai sau của một hàm trong cùng phạm vi. [..]

Tôi thực sự không biết tại sao hạn chế này được đặt ra.

quy tắc tương tự:

[C++14: 8.3.6/6]: Trừ hàm thành viên của lớp mẫu, các đối số mặc định trong định nghĩa hàm thành viên xuất hiện bên ngoài của định nghĩa lớp được bổ sung vào bộ đối số mặc định được cung cấp bởi các hàm thành viên khai báo trong định nghĩa lớp học [..]

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