2012-10-09 12 views
15

Tôi đã có một số mã mà tôi cần phải chuyển tiếp khai báo một lớp mẫu (hoặc ít nhất, chuyển tiếp khai báo sẽ làm cho mọi thứ dễ dàng hơn nhiều cho tôi. ..). Tôi đã viết một phiên bản đơn giản của vấn đề tôi đang gặp vì vậy tôi có thể hiển thị nó ở đây:"Implicit instantiation của mẫu chưa xác định" khi forward tuyên bố lớp mẫu

template<bool> 
class MyTemplateClass; 

int main(int argc, char* argv[]) 
{ 
    MyTemplateClass<false> myTemp; // error here 
    myTemp.GetTheValue(); 
    return 0; 
} 

template<bool bShouldMult> 
class MyTemplateClass 
{ 
    int m_myint; 
    float m_myfloat; 

public: 
    MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {} 
    float GetTheValue() 
    { 
     return m_myint * (bShouldMult ? m_myfloat : 1.0f); 
    } 

}; 

Các lỗi tôi nhận được tại dòng nhận xét là:

Error - implicit instantiation of undefined template 'MyTemplateClass<false>' 

gì chi tiết khác tôi có cần đưa vào khai báo trước MyTemplateClass không? Vì lỗi không đến từ dòng kế tiếp nên tôi giả định rằng không phải do thực tế là phương thức này không xác định. Trình biên dịch tôi đang sử dụng là LLVM/CLang, và tôi đang biên dịch trên Mac.

Trả lời

13

Để khai báo một biến của bất kỳ loại, mẫu hay không, toàn bộ nghĩa của loại hình đó phải có sẵn. Bạn không thể chuyển tiếp một tuyên bố mẫu, và sau đó bắt đầu sử dụng nó như thể nó đã được xác định. Tất cả các bạn có thể làm vào thời điểm đó được tuyên bố một con trỏ đến một đối tượng của một loại dựa trên mẫu, như thế này:

MyTemplateClass<false> *myTempPtr; // No error here 

Thật không may (nhưng không bất ngờ) này di chuyển lỗi để dòng tiếp theo. Vấn đề khởi tạo con trỏ đó vẫn là: khi bạn cố gắng gọi new MyTemplateClass<false>, bạn sẽ thấy lỗi.

Bạn cần phải sắp xếp lại mã của mình để di chuyển định nghĩa của mẫu trước vị trí sử dụng. Điều này có thể hơi tẻ nhạt, nhưng không có cách nào xung quanh nó: trình biên dịch cần phải có toàn bộ định nghĩa tại điểm mà bạn bắt đầu instantiating mẫu của bạn và gọi phương thức của nó.

0

Đó là từ sự hiểu biết của tôi rằng bạn không thể chuyển tiếp tuyên bố một cái gì đó và sau đó nhanh chóng nó trong ngăn xếp của bạn (mẫu hay không).

Ngoài ra tôi không nghĩ rằng có một sự hỗ trợ rất rộng cho định nghĩa về phía trước của lớp mẫu

19

Bạn có quên #include điều gì đó không?

tôi nhận này sau khi quên

#include <array> 

Khi sử dụng một std::array