C++在使用模板时没有用于调用的匹配函数,链接器错误
C++ no matching function for call when using template, linker errors
我创建了一个有用的助手方法,如下所示:
template<typename T>
T getRandomItem(vector<T> items){
if(items.isEmpty()) return nullptr;
int i = random(0, (int) items.size() - 1);
return items.at(i);
}
它只是从向量中获取随机索引,并返回该位置的项。
让我展示第一个例子:
vector<string> v = {"foo", "bar"};
string item = getRandomItem(v);
编译器在这里没有发现任何错误,但我得到了一个非常奇怪的链接器错误:
Undefined symbols for architecture armv7:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > getRandomItem<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >)", referenced from:
此外,这甚至不通过编译器:
auto v = {"foo", "bar"};
string item = getRandomItem(v);
我得到以下错误:
No matching function for call to 'getRandomItem'
如果我想直接使用它,它也不起作用:
string item = getRandomItem({"foo", "bar"});
我试着添加这样的参数:
string item = getRandomItem<string>({"foo", "bar"});
然而,我得到了另一个编译器错误:
Call to 'getRandomItem' is ambiguous.
如何修复链接器错误?我应该如何更改代码以内联传递矢量?
编辑:这个例子是由xcode 8.2.1编译的,随机函数来自cocos2d-x库(如果有关系的话)。
第2版:删除模板后,代码开始编译:
string getRandomItem(vector<string> items){
if(items.size() == 0) return nullptr;
int i = random(0, (int) items.size() - 1);
return items.at(i);
}
我现在也可以这样做:
string item = getRandomItem({"foo", "bar"});
所以主要的问题仍然存在:为什么xcode编译器不允许我在这里使用模板?
首先,{"foo", "bar"}
显然不会自动解释为字符串。它被解释为std::initializer_list<const char*>
。因此,找不到以std::initializer_list<const char*>
作为输入并返回std::string
的函数。所以你不能在那里使用auto,或者你也应该对返回类型"item"使用auto。但是,如果你把auto和模板结合得太多,你可能会得到所有你不想要的类型。
但下一行也提出了问题:if(items.isEmpty()) return nullptr;
。根据C++11标准。21.4.2.9,basic_string(const charT* s, const Allocator& a = Allocator());
要求:s不得为空指针。最好退回T()
。
链接器问题可能与您的生成脚本有关。或者在什么文件中定义所有内容。
我修复了
#include <vector>
#include <string>
#include <iostream>
#include <time.h>
using namespace std;
template<typename T>
T getRandomItem(vector<T> items) {
if (items.size() == 0) return 0;
int i = rand()%items.size()+0;
return items.at(i);
}
void main() {
srand(time(0));
vector<string> v = { "foo", "bar","test","test2"};
string item = getRandomItem(v);
cout << item<<endl;
}
我能够编译这段代码:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
template<typename T>
T getRandomItem(vector<T>& items){ // note that we should pass by reference to prevent extra copy
if(items.size() == 0) return T();
srand(time(NULL));
int i = rand()%items.size()+0;
return items.at(i);
}
int main() {
vector<string> v;
v.push_back("foo");
v.push_back("bar");
string item = getRandomItem(v);
std::cout << item;
return 0;
}
参见此处
- "error: no matching function for call to"构造函数错误
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- C++ OpenCV 卡尔曼滤波器构造函数错误
- C++:用户定义的显式类型转换函数错误
- C++ 合并字符串以'system'函数错误
- C++ wmain 函数错误时使用 Unicode
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- C++ 中常量属性的初始化构造函数错误
- 线程 std::调用未知类型,无法专门化函数错误
- 表单显示对话框函数错误,并且不执行下面的语句
- 函数错误 C2059:语法错误:'>'不起作用
- STL向量上出现奇怪的复制构造函数错误
- C++ Visual Studio 重载函数错误:没有重载函数的实例与指定的类型匹配
- C++引用已删除函数错误
- 为什么通过带有文字编号的引用调用会出现"无匹配函数"错误?
- C++ 乘法定义的构造函数错误消息似乎错误
- 在 c++ 代码中将数组传递给函数错误
- FFMPEG avcodec_decode_video2函数错误代码
- 为什么我会收到转换函数错误