Tại sao cho không có lỗi biên dịch sau đây ?:Không "định nghĩa lại lỗi thông số mặc định" cho chức năng thành viên của mẫu lớp?
// T.h
template<class T> class X
{
public:
void foo(int a = 42);
};
// Main.cpp
#include "T.h"
#include <iostream>
template<class T> void X<T>::foo(int a = 13)
{
std::cout << a << std::endl;
}
int main()
{
X<int> x;
x.foo(); // prints 42
}
Dường như dù chỉ là âm thầm bỏ qua bởi trình biên dịch. Tại sao điều này?
Điều thú vị là nếu định nghĩa mẫu lớp ở trong Main.cpp thay vì tệp tiêu đề, tôi thực sự nhận được lỗi tham số mặc định.
Bây giờ tôi biết trình biên dịch sẽ phàn nàn về điều này nếu nó chỉ là một chức năng bình thường (không phải mẫu).
Tiêu chuẩn phải nói gì về các tham số mặc định trong các hàm thành viên của mẫu lớp hoặc mẫu chức năng?
g ++ * * hủy bỏ việc biên dịch có lỗi. – sth
Khi bạn nói "... nếu khai báo mẫu trong ..." Tôi giả sử bạn có nghĩa là định nghĩa mẫu lớp, tức là 'mẫu lớp x {....};'. Nếu vậy thì bạn đang nói rằng việc thay thế chỉ thị bao gồm với định nghĩa lớp mẫu này tạo ra một thông điệp trình biên dịch khác nhau? Điều đó gợi ý rằng có một cái gì đó khác trong tệp tiêu đề tức là thử sao chép toàn bộ nội dung của tệp tiêu đề vào nơi chỉ thị bao gồm và có lẽ bạn sẽ không nhận được cảnh báo trình biên dịch? –
Troubadour
Nó có thể liên quan bằng cách nào đó với lỗi VC++ này: https://connect.microsoft.com/VisualStudio/feedback/details/496593/msdn-forum-splitting-templated-function-with-default-argument-into-declaration-definition -gives-compilation-error –