gpt4 book ai didi

c++ - 无法链接模板函数

转载 作者:太空狗 更新时间:2023-10-29 20:05:35 26 4
gpt4 key购买 nike

我有这个代码:

template<typename T>
class Listoid{

private:
std::vector<T> list;

public:
typedef typename std::vector<T>::iterator iterator;

iterator begin() {return list.begin();}
iterator end() {return list.end();}

public:
Listoid(T t) {
list.push_back(t);
}

const T operator [](int i){
return list[i];
}

void addElem(T ne){
list.push_back(ne);
}

friend T cons(T new_elem, Listoid<T> list);

};

template<typename T>
Listoid<T> cons(T new_elem, Listoid<T> list){

Listoid<T> new_list(new_elem);
for(typename Listoid<T>::iterator it = list.begin(), e = list.end();
it != e; ++it){
new_list.addElem(*it);
}
return new_list;
}


int main(){

Listoid<int> lista(312);
lista.addElem(22);

Listoid<int> lista2 = cons(21, lista);

return EXIT_SUCCESS;
}

但是我不能编译它;我收到以下错误:

/tmp/listoid-3kYCmd.o: In function `main':
listoid.cpp:(.text+0xda): undefined reference to `cons(int, Listoid<int>)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

也许这很简单,但我无法解决。有人可以帮忙吗?

最佳答案

你必须告诉编译器 cons 是函数模板而不是简单函数。使用此语法:

friend T cons <>(T new_elem, Listoid<T> list);

注意 > 在函数名称之后。

否则就是搜索简单的函数,而不是函数模板。那是链接器告诉你的。

[更新]

并且不要忘记在友元类之前添加函数的前向声明,这样您的类就会知道友元是什么。

template<typename T>
Listoid<T> cons(T new_elem, Listoid<T> list);

[更新2]

并更改函数模板的类型,并添加类的前向声明。见:

template<typename T>
class Listoid;
template<typename T>
Listoid<T> cons(T new_elem, Listoid<T> list);

template<typename T>
class Listoid{
...

friend Listoid<T> cons <>(T new_elem, Listoid<T> list);

};

这对我有用:ideone

关于c++ - 无法链接模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12466301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com