我有两个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
答案 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
扩展名的文件应包含在其他文件中,而不是单独编译。