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;
}