编译错误:无法推断出模板参数

时间:2013-11-25 00:00:52

标签: c++ function class templates

我正在努力完成我的学校项目,但我遇到了一个问题。我正在尝试在我的工作中使用模板,但似乎我真的不明白该怎么做。这是我的代码的一部分:

的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

提前致谢!

1 个答案:

答案 0 :(得分:2)

为了使编译器推导出模板参数,这些模板参数必须依赖于函数参数类型。在你的情况下

template <class szak>
szak diakokBeolvasasa(char);

模板参数不依赖于函数参数类型。因此,编译器无法推导出此函数的模板参数。 (编译器不能从函数返回类型中推导出模板参数。)

调用此函数时,您必须明确指定模板参数,如

diakokBeolvasasa<double>(kepzes);

在上面的示例中,使用您希望szak代替double的任何类型。

您的diakokBeolvasasa功能还有另一个潜在问题。它似乎返回I33G22类型的结果。如果这些类型不相关,那么......好吧......不能这样做。没有函数可以在C ++中返回“不可预测”类型。模板不会帮助你。那么,I33G22是否以某种方式相关?

第二个错误只是第一个错误的产物。

P.S。正如评论中所述,您不应将模板定义放入.cpp文件中。必须在头文件中定义模板。