簡體   English   中英

編譯錯誤:無法推斷出模板參數

[英]Compile error: could not deduce template argument

我正在努力完成我的學校項目,但我遇到了一個問題。 我正在嘗試在我的工作中使用模板,但似乎我真的不明白該怎么做。 這是我的代碼的一部分:

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

提前致謝!

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

template <class szak>
szak diakokBeolvasasa(char);

template參數不依賴於函數參數類型。 因此,編譯器無法推導出此函數的模板參數。 (編譯器無法從函數返回類型推導出模板參數。)

調用此函數時,您必須明確指定模板參數,如

diakokBeolvasasa<double>(kepzes);

在上面的例子中,使用你想要的szak代替double任何類型。

您的diakokBeolvasasa功能還有另一個潛在問題。 它似乎返回I33G22類型的結果。 如果這些類型不相關,那么......好吧......不能這樣做。 沒有函數可以在C ++中返回“不可預測”類型。 模板不會幫助你。 那么, I33G22以某種方式相關?

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

PS正如評論中指出的那樣,您不應將模板定義放入.cpp文件中。 必須在頭文件中定義模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM