在制作库时遇到了以下问题:
我们有四个文件:
以下是每个文件的内容
#include <iostream>
#include <vector>
#include "nsp/nsp.hpp"
using namespace std;
int main(){
vector<int> v = {0, 1};
nsp::A<int> a = nsp::A<int>::from(v.begin(), v.end());
cout << a.getElem();
return 0;
}
#ifndef NSP_HPP
#define NSP_HPP
namespace nsp{};
#include "A.h"
#endif
#ifndef NSP_A_H
#define NSP_A_H
namespace nsp{
template <class T>
class A{
protected:
T elem;
A();
public:
A(T e);
template <class It>
static A<T> from(It begin, It end);
T getElem();
};
};
#endif
#include "A.h"
template <class T>
nsp::A<T>::A(){}
template <class T>
nsp::A<T>::A(T elem){ this->elem = elem; }
template <class T, class It>
nsp::A<T> nsp::A<T>::from(It begin, It end){
nsp::A<T> tmp;
if(begin != end)
tmp.elem = static_cast<T>(*begin);
return tmp;
};
template <class T>
T nsp::A<T>::getElem(){ return this->elem; }
尽管这个代码对我来说似乎是正确的(没有语法错误)并且我使用的IDE(CLion)表明所有成员函数都已实现,但在编译时我收到以下错误:
(nsp/A.cpp) error: prototype for 'nsp::A<T> nsp::A<T>::from(It, It)' does not match any in class 'nsp::A<T>'
(nsp/A.h) error: candidate is: template<class T> template<class It> static nsp::A<T> nsp::A<T>::from(It, It)
我想知道这个错误的原因是什么以及我如何解决它。
答案 0 :(得分:3)
从模板类定义模板成员时,必须编写template <...>
两次:
template <class T>
template <class It>
nsp::A<T> nsp::A<T>::from(It begin, It end){
nsp::A<T> tmp;
if(begin != end)
tmp.elem = static_cast<T>(*begin);
return tmp;
}
但是您还有另一个问题:template functions can only be defined in header files(除非您希望提前枚举模板应该使用的所有类型,否则链接也应该解释这个问题。)
您可以在类主体内定义成员函数,也可以在头文件中的类下面定义;无论你喜欢什么。