2012-05-17 39 views
55

Tôi có ba tệp. Nội dung của main.cpp làtham chiếu không xác định đối với hàm mẫu

#include<iostream> 
#include<QString> 

#include "util.h" 

int main() 
{ 
    using Util::convert2QString; 

    using namespace std; 
    int n =22; 
    QString tmp = convert2QString<int>(n); 

    return 0; 
} 

util.h

namespace Util 
{ 
    template<class T> 
    QString convert2QString(T type , int digits=0); 
} 

util.cpp

namespace Util 
{ 
    template<class T> 
     QString convert2QString(T type, int digits=0) 
     { 
      using std::string; 

      string temp = (boost::format("%1%") % type).str(); 

      return QString::fromStdString(temp); 
     } 
} 

Khi tôi cố gắng để biên dịch các file này với lệnh sau tôi nhận được lỗi tham chiếu không xác định

[email protected]:~/work/trash/template$ g++ main.cpp util.cpp -lQtGui -lQtCore -I. -I/usr/local/Trolltech/Qt-4.8.0/include/QtCore -I/usr/local/Trolltech/Qt-4.8.0/include/QtGui -I/usr/local/Trolltech/Qt-4.8.0/include 
/tmp/cca9oU6Q.o: In function `main': 
main.cpp:(.text+0x22): undefined reference to `QString Util::convert2QString<int>(int, int)' 
collect2: ld returned 1 exit status 

có điều gì sai trái với việc khai báo hoặc triển khai mẫu không? tại sao tôi nhận được các lỗi liên kết này:?

Trả lời

88

Việc triển khai mẫu không chuyên biệt phải được hiển thị cho đơn vị dịch sử dụng nó.

Trình biên dịch phải có khả năng xem triển khai để tạo mã cho tất cả các chuyên ngành trong mã của bạn.

Điều này có thể đạt được theo hai cách:

1) Di chuyển thực hiện bên trong tiêu đề.

2) Nếu bạn muốn giữ nó tách, chuyển nó thành một tiêu đề khác nhau mà bạn có bao gồm trong tiêu đề ban đầu của bạn:

util.h

namespace Util 
{ 
    template<class T> 
    QString convert2QString(T type , int digits=0); 
} 
#include "util_impl.h" 

util_impl.h

namespace Util 
{ 
    template<class T> 
     QString convert2QString(T type, int digits=0) 
     { 
      using std::string; 

      string temp = (boost::format("%1") % type).str(); 

      return QString::fromStdString(temp); 
     } 
} 
+9

Nhiều người sử dụng phần mở rộng '.tcc' cho mẫu triển khai mẫu les. –

19

Bạn có 2 cách:

  1. Triển khai convert2QString trong util.h.

  2. thủ nhanh chóng convert2QString với int trong util.cpp và xác định chuyên môn hóa này như chức năng extern trong util.h

util.h

namespace Util 
{ 
    template<class T> 
    QString convert2QString(T type , int digits=0); 

    extern template <> QString convert2QString<int>(int type , int digits); 
} 

util.cpp

namespace Util { 
    template<class T> 
    QString convert2QString(T type, int digits) 
    { 
     using std::string; 

     string temp = (boost::format("%1") % type).str(); 

     return QString::fromStdString(temp); 
    } 

    template <> QString convert2QString<int>(int type , int digits); 
} 
Các vấn đề liên quan