【问题标题】:Compile error: could not deduce template argument编译错误:无法推断模板参数
【发布时间】:2013-12-09 13:39:27
【问题描述】:

我正在尝试完成我的一个学校项目,但我遇到了问题。我正在尝试在我的工作中使用模板,但似乎我并不真正了解如何做到这一点。这是我的代码的一部分:

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

提前致谢!

【问题讨论】:

  • 通用模板定义必须与其声明位于同一文件中。而且没有办法从返回类型中推断出模板参数。
  • 那么这样的模板就没有办法使用了吗?
  • 我能给你的最好的答案是发布的答案,但除非你想要链接器错误,否则你仍然需要移动定义。
  • 题外话:匈牙利命名听起来很有趣

标签: c++ function class templates


【解决方案1】:

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

template <class szak>
szak diakokBeolvasasa(char);

模板参数不依赖于函数参数类型。由于这个原因,编译器不可能为这个函数推导出模板参数。 (编译器无法从函数返回类型推断模板参数。)

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

diakokBeolvasasa<double>(kepzes);

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

您的diakokBeolvasasa 函数还有另一个潜在问题。它似乎返回I33G22 类型的结果。如果这些类型不相关,那么……嗯……不能那样做。在 C++ 中没有函数可以返回“不可预测”的类型。模板在这里帮不了你。那么,I33G22 是否相关?

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

附:正如 cmets 中所述,您不应将模板定义放入 .cpp 文件中。模板必须在头文件中定义。

【讨论】:

  • 感谢您的帮助!他们不是,但我已经做了一个解决方法。我只是用 I33 调用函数两次,用 G22 调用第二次,这样编译器就知道它应该返回调用函数的内容。
  • 你可以在 .inl 文件中定义它们。
  • @user2176127:是的,但是您必须将这些.inl 文件包含在您想要使用这些功能的任何位置。最终效果与在头文件中定义它们相同。但出于代码组织的目的,人们可能确实决定将它们定义在单独的可包含文件中(如.inl 或此类)。
猜你喜欢
  • 2014-11-20
  • 2010-10-17
  • 2020-01-21
  • 2010-12-22
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多