【问题标题】:Undefined Reference To 'function未定义对'函数的引用
【发布时间】:2017-10-17 22:27:25
【问题描述】:
#include <iostream>
using namespace std;

void doStuff();

int main() {
    doStuff();
    return 0;
}

template<typename T>
void doStuff() {
    T k = 6;
    cout << k << endl;
} 

你好。我被这个错误困住了。每次我都会收到类似“未定义对 doStuff 的引用”的错误。这个问题有解决办法吗?

【问题讨论】:

  • 调用函数时必须指定数据类型!

标签: c++ templates error-handling


【解决方案1】:

doStuff()的声明表示非模板函数,定义为函数模板,不匹配。

我想你想要的是函数模板,那么

template<typename T>
void doStuff() {
    T k = 6;
    cout << k << endl;
} 
int main() {
    doStuff<int>();
    return 0;
}

您也可以将声明放在main() 之前,将定义放在main() 之后。例如

template<typename T>
void doStuff();
int main() {
    doStuff<int>();
    return 0;
}
template<typename T>
void doStuff() {
    T k = 6;
    cout << k << endl;
} 

注意,调用doStuff时需要指定模板参数,因为不能自动推导出来。

【讨论】:

  • 这个答案将受益于您如何转发声明函数模板的示例,因此不必在调用之前定义它。
【解决方案2】:

由于它是一个模板函数,因此在调用函数时需要类型名称。

对于int

doStuff<int>();

对于字符

doStuff<char>();

所以程序看起来像

#include <iostream>
using namespace std;


template<typename T>
void doStuff() {
    T k = 6;
    cout << k << endl;
}


int main() {
    doStuff<int>();
    return 0;
}

【讨论】:

  • 你做了什么@Quentin
  • 请阅读问题,他是否要求解释,他只是要求解决方案@Quentin
  • 换句话说,你的修复does not work on its own,因为它不能解决 OP 中的不匹配声明问题。
  • 现在这是一个建设性的评论,我将编辑我的回答“删除前向声明”(Y)@Quentin
猜你喜欢
  • 2019-09-05
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2012-10-07
  • 2015-10-02
  • 2012-10-14
相关资源
最近更新 更多