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
下面是每个文件的内容

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(){}
模板
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;
}