C++ 带有模板化静态成员函数的模板化类与实现中的原型不匹配
在创建库的过程中,我遇到了以下问题: 让我们有四个文件:C++ 带有模板化静态成员函数的模板化类与实现中的原型不匹配,c++,c++11,templates,C++,C++11,Templates,在创建库的过程中,我遇到了以下问题: 让我们有四个文件: main.cpp nsp/nsp.hpp nsp/A.h nsp/A.cpp 下面是每个文件的内容 main.cpp nsp/A.h \ifndef NSP\u A\H #定义NSP\u A\u H 名称空间nsp{ 模板 甲级{ 受保护的: 元素; A(); 公众: A(te); 模板 静态A从(它开始,它结束); T getElem(); }; }; #恩迪夫 nsp/A.cpp #包括“A.h” 模板 nsp::A::A(){
- main.cpp
- nsp/nsp.hpp
- nsp/A.h
- nsp/A.cpp
\ifndef NSP\u A\H
#定义NSP\u A\u H
名称空间nsp{
模板
甲级{
受保护的:
元素;
A();
公众:
A(te);
模板
静态A从(它开始,它结束);
T getElem();
};
};
#恩迪夫
nsp/A.cpp
#包括“A.h”
模板
nsp::A::A(){}
模板
nsp::A::A(T元素){this->elem=elem;}
模板
nsp::A nsp::A::from(它开始,它结束){
nsp::tmp;
如果(开始!=结束)
tmp.elem=静态施法(*开始);
返回tmp;
};
模板
T nsp::A::getElem(){返回此->元素;}
尽管这段代码对我来说似乎是正确的(没有语法错误),而且我使用的IDE(CLion)表明所有成员函数都已实现,但在编译时我遇到了以下错误:
(nsp/A.cpp)错误:“nsp::A nsp::A::from(It,It)”的原型与类“nsp::A”中的任何原型都不匹配。
接
(nsp/A.h)错误:候选项是:模板模板静态nsp::A nsp::A::来自(It,It)
我想知道此错误的原因以及解决方法。从模板类定义模板成员时,必须编写
模板两次:
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;
}
模板
模板
nsp::A nsp::A::from(它开始,它结束){
nsp::tmp;
如果(开始!=结束)
tmp.elem=静态施法(*开始);
返回tmp;
}
但您还有另一个问题:(除非您希望枚举模板应该提前处理的所有类型,否则链接也应该解释这一点)
您可以在类主体内部或在头文件中的类下方定义成员函数;无论您喜欢什么。从模板类定义模板成员时,必须编写模板
两次:
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;
}
模板
模板
nsp::A nsp::A::from(它开始,它结束){
nsp::tmp;
如果(开始!=结束)
tmp.elem=静态施法(*开始);
返回tmp;
}
但您还有另一个问题:(除非您希望枚举模板应该提前处理的所有类型,否则链接也应该解释这一点)
您可以在类主体内部或在头文件中的类下方定义成员函数;您更喜欢什么都行。改为使用模板模板
。改为使用模板
。感谢您的回答,分离模板类型并将实现放在头文件中解决了问题。感谢您的回答,分离模板类型并将实现放在头文件中解决了这个问题。
#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; }
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;
}