我有这个代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
但我无法编译它; 我收到以下错误:
/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)
Run Code Online (Sandbox Code Playgroud)
也许这很简单,但我无法解决它.有人可以帮忙吗?
你必须告诉编译器cons功能模板不是简单的功能.使用以下语法:
friend T cons <>(T new_elem, Listoid<T> list);
Run Code Online (Sandbox Code Playgroud)
注意函数名后的<>.
否则它正在搜索简单的功能,而不是功能模板.这是链接器告诉你的.
[UPDATE]
并且不要忘记在其朋友课之前添加你的函数的前向声明,这样你的班级就会知道什么是朋友.
template<typename T>
Listoid<T> cons(T new_elem, Listoid<T> list);
Run Code Online (Sandbox Code Playgroud)
[UPDATE2]
并更改函数模板的类型,并添加类的前向声明.看到:
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);
};
Run Code Online (Sandbox Code Playgroud)
这适合我:ideone
| 归档时间: |
|
| 查看次数: |
991 次 |
| 最近记录: |