繁体   English   中英

候选模板被忽略:无法推断模板参数“T”

[英]Candidate template ignored: couldn't infer template argument 'T'

我知道这个问题之前可能已经被问过,但我是模板的初学者,这是我的代码,

头文件.h

class Identity  {
    public:    
        template <typename T>
        T getFamilyMembers() {
            if(1) {
              return false;
            }
            std::string whatever = "Test";
            return whatever;
        }
};

主文件

#include "HeaderFile.h"

int main() {
  Identity id;
  std::cout << id.getFamilyMembers() << "\n";
}

编译器发出两个错误,

Main.cpp:25:10: error: no matching member function for call to 'getFamilyMembers'
      id.getFamilyMembers();
      ~~~^~~~~~~~~~
HeaderFile.h:22:11: note: candidate template ignored: couldn't infer template argument 'T'
        T getFamilyMembers() {

这不是模板的工作方式。

调用者指定T是什么。 T是返回类型时,function 中的所有return 语句都必须是T值,或者可以隐式转换为T的东西。 function 本身无法规定T在运行时是什么。

除此之外, T在编译时是已知的。 没有像std::variant这样的变体类型的帮助,你不能在不同的情况下返回不同的类型。

对于每个不同的T ,创建一个全新版本的 function。 因此,当通用算法可以应用于多种类型时,使用模板函数。 例如,“交换两个值”算法的简单实现可能会将其中一个值复制到临时变量:

void swap(int & a, int & b) {
    int temp = a;
    a = b;
    b = temp;
}

但是现在我们必须为我们想要交换的每种可能类型的东西编写一个新的swap() function:输入模板,我们编写一次 function:作为模板:

template <typename T>
void swap(T & a, T & b) {
    T temp = a;
    a = b;
    b = temp;
}

现在编译器将为我们完成这项工作,只要它看到以前没有的T就创建新版本的swap()


在您的特定情况下,如果您想返回一个可能是字符串但可能什么都不是的值,这就是std::optional的用途。 在这种情况下,您可以返回一个std::optional<std::string> 您也可以只返回std::string并使用空字符串来表示没有家庭成员。

鉴于 function 的名称意味着可以返回多个项目,让 function 返回std::vector<std::string>然后“没有家庭成员”的情况简单地表示为空可能更有意义向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM