2013-11-25 76 views
0

我正在嘗試完成我的一個學校項目,但遇到了問題。我正在嘗試在我的工作中使用模板,但似乎我並不真正瞭解如何做到這一點。這裏,我的代碼部分:編譯錯誤:無法推斷模板參數

的main.cpp

#include "stdafx.h" 
#include "Osztaly.h" 
#include "Fuggvenyek.h" 
#include <string> 
#include <iostream> 

int main(){ 
    char kepzes = setKepzes(); 
    //diakokBeolvasasa(kepzes); 
    diakokKiirasa(kepzes, diakokBeolvasasa(kepzes)); 
    return 0; 
} 

Fuggvenyek.h

#ifndef FUGGVENYEK_H 
#define FUGGVENYEK_H 

char setKepzes(); 

template <class szak> 
szak diakokBeolvasasa(char); 

template <class szak> 
void diakokKiirasa(char, szak); 

#endif 

所以我想這取決於if語句傳回不同類型的值。 DiakokKiirasa函數然後應該接受它作爲第二個參數,並用它來寫出一些其他的東西。

Fuggvenyek.cpp

#include "Fuggvenyek.h" 
#include "Osztaly.h" 
using namespace std; 

char setKepzes(){ 
    char kepzes; 
    cout << "A beolvasando szemely kivalasztott kepzese:\n i - informatikus" 
     << "g - gepesz\n>> "; 
    cin >> kepzes; 
    return kepzes; 
} 

template <class szak> 
szak diakokBeolvasasa(char kepzes){ 
    I33 informatikusok; 
    G22 gepeszek; 
    //ha a kepzese informatikus 
    if (kepzes == 'i'){ 
     informatikusok.setDiakokSzama();   
     informatikusok.setDiakAdatok(); 
     return informatikusok; 
    } 
    //ha a kepzese gepesz 
    else if (kepzes == 'g'){ 
     gepeszek.setDiakokSzama(); 
     gepeszek.setDiakAdatok();  
     return gepeszek; 
    } 
} 

template <class szak> 
void diakokKiirasa(char kepzes, szak diakok){ 
     diakok.getDiakAdatok(); 
} 

我的編譯錯誤:

Error 1 error C2783: 'szak diakokBeolvasasa(char)' : could not deduce template argument for 'szak' d:\programming\c++\cppproject\cppproject\main.cpp 10 1 CppProject 
Error 2 error C2780: 'void diakokKiirasa(char,szak)' : expects 2 arguments - 1 provided d:\programming\c++\cppproject\cppproject\main.cpp 10 1 CppProject 

提前感謝!

+0

通用模板定義必須與其聲明位於同一個文件中。而且無法從返回類型推斷出模板參數。 – chris

+0

那麼有沒有辦法使用這樣的模板? – Grobi

+0

我可以給你的最好的答案是已發佈的,但是除非你想要鏈接器錯誤,否則你仍然需要移動定義。 – chris

回答

2

爲了使編譯器推導出模板參數,這些模板參數必須依賴於函數參數類型。在你的情況下,

template <class szak> 
szak diakokBeolvasasa(char); 

模板參數不依賴於函數參數類型。由於這個原因,編譯器不可能推導出這個函數的模板參數。 (編譯器不能推斷出函數的返回類型的模板參數)。

當調用此功能,您必須明確指定模板參數,如你想你的szak要到位

diakokBeolvasasa<double>(kepzes); 

使用任何類型上例中的double

您的diakokBeolvasasa函數還有另一個潛在的問題。它似乎返回I33G22類型的結果。如果這些類型是不相關的,那麼......好吧......不能這樣做。在C++中沒有可以返回「不可預知」類型的函數。和模板不會幫你在這裏。那麼,I33G22莫名其妙或不相關?

第二個錯誤只是第一個錯誤的產物。

P.S.正如註釋中所指出的那樣,您不應將模板定義放置到.cpp文件中。模板必須在頭文件中定義。

+0

感謝您的幫助!他們不是,但我已經做出瞭解決方法。我只是用I33調用函數兩次,第二次調用G22,這樣編譯器知道它應該返回到調用函數。 – Grobi

+0

雖然你可以在.inl文件中定義它們。 – user2176127

+0

@ user2176127:是的,但是您必須將這些'.inl'文件包含在您想要使用函數的任何位置。最終效果與在頭文件中定義它們的效果相同。但對於代碼組織的目的,人們可能確實決定將它們定義在單獨的可包含文件中(如'.inl'或類似文件)。 – AnT