Tôi có các chức năng templated trong dự án C++ 11 Xcode của tôi và một số trong chúng có chuyên môn. Tuy nhiên, tôi đã phát hiện ra rằng các chuyên môn chỉ được gọi trong các bản dựng gỡ lỗi; nếu tôi xây dựng trong bản phát hành, họ sẽ bị bỏ qua.Tại sao chức năng mẫu chuyên biệt của tôi chỉ được gọi trong các bản dựng gỡ lỗi?
tôi đã tạo thành công một ví dụ rất đơn giản:
special.h
#include <cstdio>
struct special
{
template<typename T>
void call(const T&) { puts("not so special"); }
};
special.cpp
#include "special.h"
#include <string>
template<>
void special::call(const std::string&) { puts("very special"); }
main.cpp
#include "special.h"
#include <string>
int main()
{
std::string str = "hello world";
special s;
s.call(123);
s.call(str);
}
You can download the project (cho đến một nơi nào đó vào mùa hè này ít nhất là 2013) để tái tạo sự cố nếu bạn không muốn tự tạo ra sự cố. Trước tiên hãy chạy dự án với cấu hình gỡ lỗi, sau đó chạy lại nó trong bản phát hành. Kết quả mà tôi mong đợi là:
không quá đặc biệt
rất đặc biệt
Và đây thực sự là những gì tôi nhận được với cấu hình Debug xây dựng. Tuy nhiên, với phát hành, tôi có được điều này:
không quá đặc biệt
không quá đặc biệt
Có nghĩa là việc thực hiện chuyên môn của special::call
trong special.cpp đã bị bỏ qua.
Tại sao kết quả không phù hợp? Tôi nên làm gì để đảm bảo rằng chức năng chuyên biệt được gọi trong bản phát hành bản phát hành?
Đặt nó vào .h thay vì .cpp? – Pubby
special.cpp được liên kết trong cả hai trường hợp? – ForEveR
Có, special.cpp được biên dịch và liên kết trong cả hai trường hợp. Nếu tôi đặt chuyên môn trong tệp tiêu đề, nó hoạt động nếu tệp được bao gồm trong một tệp .cpp, nhưng nếu không tôi sẽ gặp lỗi biểu tượng trùng lặp. – zneak