C++ C++;使用模板时没有用于调用的匹配函数,链接器错误
我创建了有用的助手方法,如下所示:C++ C++;使用模板时没有用于调用的匹配函数,链接器错误,c++,C++,我创建了有用的助手方法,如下所示: 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); } string item = getRandomItem<string>({"foo", "
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);
}
string item = getRandomItem<string>({"foo", "bar"});
我发现以下错误:
No matching function for call to 'getRandomItem'
如果我想内联使用它,它也不起作用:
string item = getRandomItem({"foo", "bar"});
我尝试在以下参数之前添加:
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);
}
string item = getRandomItem<string>({"foo", "bar"});
如何修复链接器错误?我应该如何更改代码以内联传递向量
编辑:
本例由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);
}
所以主要的问题仍然是:为什么xcode编译器不允许我在这里使用模板?首先,首先:
{“foo”,“bar”}
显然不会自动解释为字符串。它被解释为一个std::initializer\u list
。因此,没有找到将std::initializer\u list
作为输入并返回std::string
的函数。因此,您不能在那里使用auto,或者您还应该对返回类型“item”使用auto。但是如果你把自动模板和模板结合得太多,你可能会得到所有你不想要的类型
但是下一行也会问问题:if(items.isEmpty())返回null ptr代码>。根据C++11标准,第。21.4.2.9,basic_字符串(常量图表*s,常量分配器&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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
模板
T getRandomItem(向量项){
if(items.size()==0)返回0;
int i=rand()%items.size()+0;
退货项目。见第(i)条;
}
void main(){
srand(时间(0));
向量v={“foo”,“bar”,“test”,“test2”};
字符串项=getRandomItem(v);
cout我能够编译这段代码:
#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
模板
T getRandomItem(vector&items){//注意,我们应该通过引用传递,以防止额外的复制
如果(items.size()==0)返回T();
srand(时间(空));
int i=rand()%items.size()+0;
退货项目。见第(i)条;
}
int main(){
向量v;
v、 推回(“foo”);
v、 向后推(“杆”);
字符串项=getRandomItem(v);
std::无法显示构建命令(编译和链接)。也不会剪切错误消息。另外,您希望v
在auto v={“foo”,“bar”};
中的具体位置是什么?为什么?可能是?{“foo”,“bar”}
不是向量。为了内联传递类似它的内容,请查看。不要注意复制向量,请查看所有其他向量(因为{“foo”,“bar”}
不是向量)。看到有趣的内容了吗?您是右-自动将不起作用。但是在删除模板(我只是左向量)后,我可以传递{“foo”,“bar”}在函数调用中,我还将isEmpty更改为size()==0。请参阅我的编辑。我仍然在xcode中遇到链接器错误。我必须删除模板,只保留vector以使其工作。如果项为空,则无法返回0。如果0对于类型t没有意义,该怎么办。string item=0;
它可能会工作,因为某些隐式转换,但不是您的意思。return t();
相反。你是对的,但这并不重要。我解决了主要问题。
string item = getRandomItem({"foo", "bar"});
#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;
}