带有模板化静态成员函数的模板化类与实现中的原型不匹配

时间:2018-02-11 10:13:05

标签: c++ c++11 templates

在制作库时遇到了以下问题:

我们有四个文件:

  • 的main.cpp
  • NSP / nsp.hpp
  • NSP / A.H
  • NSP / A.cpp

以下是每个文件的内容

的main.cpp

#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;
}

NSP / nsp.hpp

#ifndef NSP_HPP
#define NSP_HPP

namespace nsp{};

#include "A.h"

#endif

NSP / A.H

#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

NSP / A.cpp

#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)

我想知道这个错误的原因是什么以及我如何解决它。

1 个答案:

答案 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(除非您希望提前枚举模板应该使用的所有类型,否则链接也应该解释这个问题。)

您可以在类主体内定义成员函数,也可以在头文件中的类下面定义;无论你喜欢什么。