2016-09-16 31 views
-2

呼叫者C++模板函數...如何調用鏈接SAIDS時未定義的引用下面的基類(非模板類)

在base.h文件:

class tempc { 
    public: 
    int a; 
} ; 
class base     // base class 
{ 
    public:    // public 
    template<T> int func(T*);  // template defined here 
}; 

在base.cpp文件:

template<T> 
int base :: func(T*) 
{ 
    std::cout << "base::func called" << std::endl; 
    return 0; 
} 
在derived.cpp文件

class derived : public: base // class defined 
{ 
    void caller() 
    { 
     tempc a; 
     func<tempc>(&a); // template used here 
     base::func<tempc>(&a); 
    } 
}; 
int main() 
{ 
    derived d; 
    d.caller(); 
} 

錯誤是: 未定義參考`空隙鹼:: FUNC(tempc *)」

基是基類

衍生自鹼派生類

此呼叫者甾體抗炎藥未定義參考...

//抱歉,因爲我的源代碼是reaaaaly過大而出現

+0

其中是您的函數的實現/定義? – Hayt

+1

函數模板在哪裏定義*(與您的代碼顯示的只是*聲明相對)? – Angew

+4

歡迎來到Stack Overflow!請**用[mcve]或[SSCCE(Short,Self Contained,Correct Example)](http://sscce.org)**您的問題,幷包含確切的錯誤信息。 – NathanOliver

回答

0

代碼工作正常(你糾正廢話SY後ntax):

class base 
{ 
    public: 
    template<class T> int func(); 
    //  ^^^^^ 
    //  use class keyword 

}; // <-- semicolon here 

template<class T> 
//  ^^^^^ 
//  use class keyword 
int base::func() 
{ 
    return 0; 
} 

class derived : public base 
//     ^
//     no colon here 
{ 
    void caller() 
    { 
     func<int>(); // it works 
     base::func<int>(); // this works too 
    } 
}; // <-- semicolon here 
+0

它不起作用......但我將實現複製到派生類,它的工作原理... – Anything

+0

你是什麼意思,它不工作。這是有史以來最無助的診斷。看看這裏,它的作品:http://ideone.com/b0mLVI – bolov

+0

這個答案的代碼[作品](http://coliru.stacked-crooked.com/a/5cf53a8256f1f62b)。如果你的不是這樣,**以我們的**(通過編輯問題)告訴我們你的不同之處。 – Angew

相關問題