模板参数声明

时间:2014-12-27 10:58:20

标签: c++ templates

我有两个c ++模板。我想要h和cpp文件。它仅适用于一个模板,但它不适用于两个不同的模板。我从gcc收到此错误:

../Temp1.cpp:16:17: error: definition of ‘Name::Temp1<T>::Temp1()’ is not in namespace enclosing ‘Name::Temp1<T>’ [-fpermissive]
../Temp1.cpp:22:18: error: definition of ‘Name::Temp1<T>::~Temp1()’ is not in namespace enclosing ‘Name::Temp1<T>’ [-fpermissive]
make: *** [Temp2.o] Error 1

这里是Temp1标题的代码:

#ifndef TEMP1_H_
#define TEMP1_H_

namespace Name {

template<class T>
class Temp1 {
public:
    Temp1();
    virtual ~Temp1();
};

#include "Temp1.cpp"

} /* namespace Name */

#endif /* TEMP1_H_ */

Temp1 cpp:

#ifndef TEMP1_CPP_
#define TEMP1_CPP_

#include "Temp1.h"

namespace Name {

template<class T>
Temp1<T>::Temp1() {
    // TODO Auto-generated constructor stub

}

template<class T>
Temp1<T>::~Temp1() {
    // TODO Auto-generated destructor stub
}

} /* namespace Name */

#endif

Temp2标题:

#ifndef TEMP2_H_
#define TEMP2_H_

#include "Temp1.h"

namespace Name {

template<class T>
class Temp2: public Temp1<T> {
public:
    Temp2();
    virtual ~Temp2();
};

#include "Temp2.cpp"

} /* namespace Name */

#endif /* TEMP2_H_ */

Temp2 cpp:

#ifndef TEMP2_CPP_
#define TEMP2_CPP_

#include "Temp2.h"

namespace Name {

template<class T>
Temp2<T>::Temp2() {
    // TODO Auto-generated constructor stub

}

template<class T>
Temp2<T>::~Temp2() {
    // TODO Auto-generated destructor stub
}

} /* namespace Name */

#endif

1 个答案:

答案 0 :(得分:3)

您在Temp1.cpp中的名称空间正文中包含了Temp1.h ,而Temp1.cpp也有namespace Name。考虑它在预处理后的结果如何:

namespace Name {

template<class T>
class Temp1 {
public:
    Temp1();
    virtual ~Temp1();
};

namespace Name {

template<class T>
Temp1<T>::Temp1() {
    // TODO Auto-generated constructor stub

}

template<class T>
Temp1<T>::~Temp1() {
    // TODO Auto-generated destructor stub
}

} /* namespace Name */

} /* namespace Name */

换句话说,您不小心将成员函数定义放在名称空间Name::Name中,而不是名称空间Name

作为旁注,通常的惯例是,您不使用.cpp扩展名的文件应包含在其他文件中,而不是单独编译。