2012-02-07 32 views
5
I'm getting an "unresolved external symbol "public:__thiscall hijo<int>::hijo<int>(void)" referenced in function_main 

Tôi đã bắt đầu một dự án mới khiến tôi gặp phải lỗi tương tự trên một dự án lớn hơn. Lỗi xảy ra khi tôi cố gắng phân bổ không gian bằng cách sử dụng từ khóa mới. Nếu lỗi này là ngớ ngẩn xin vui lòng tha thứ cho tôi vì tôi đã không lập trình bất cứ điều gì trong những tháng qua.Lỗi trình liên kết khi sử dụng một lớp mẫu?

/********************file hijo.h******************/ 
#pragma once 
#ifndef hijo_h 
#define hijo_h 

template <class A> 
class hijo 
{ 
public: 
    hijo(void); 
    ~hijo(void); 
}; 
#endif 


    /********************file hijo.cpp***************/ 
    #include "hijo.h" 
#include <iostream> 
using namespace std; 

template <class A> 
hijo<A>::hijo(void) 
{ 
} 
template <class A> 
hijo<A>::~hijo(void) 
{ 
} 
    /*********************at main() function ***************/ 

#include <iostream> 
#include "hijo.h" 

int main(){ 

    hijo<int> *h = new hijo<int>; <---- PROBLEM AT THIS LINE 

    system("pause"); 
    return 0; 
} 

Trả lời

10

Do tính lạ trong mô hình biên dịch của C++, bạn không thể phân tách tệp .h và .cpp rất rõ ràng cho các lớp mẫu. Cụ thể, bất kỳ đơn vị dịch nào (tệp nguồn C++) muốn sử dụng một lớp mẫu phải có quyền truy cập vào toàn bộ định nghĩa mẫu. Đây là một điều kỳ lạ của ngôn ngữ, nhưng tiếc là nó ở đây để ở.

Một tùy chọn là đặt triển khai trong tệp tiêu đề thay vì trong nguồn, sau đó không có tệp .cpp. Ví dụ: bạn có thể có tiêu đề này:

#pragma once 
#ifndef hijo_h 
#define hijo_h 

template <class A> 
class hijo 
{ 
public: 
    hijo(void); 
    ~hijo(void); 
}; 

/* * * * Implementation Below This Point * * * */ 

template <class A> 
hijo<A>::hijo(void) 
{ 
} 
template <class A> 
hijo<A>::~hijo(void) 
{ 
} 

#endif 

Hy vọng điều này sẽ hữu ích!

+0

"nhưng tiếc là nó ở đây để ở" - cho đến khi chúng tôi nhận được mô-đun. \ * vượt qua các ngón tay * – Xeo

+0

HOẠT ĐỘNG NHƯ MỘT CHARM, chỉ cần làm một chút sửa chữa cho giải pháp của bạn. thay vì thêm mã trong tệp .h tôi chỉ bao gồm tệp .cpp ở cuối tệp .h. Kết quả tương tự như cả hai phần đều nằm trong cùng một tệp. trong "hijo.cpp" #ifndef hijo_cpp #define hijo_cpp và ở dưới cùng #endif ... cảm ơn u cho câu trả lời của bạn ... – HoNgOuRu

+0

gotta chờ hơn 8 phút để đánh dấu các câu hỏi như được trả lời – HoNgOuRu

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