C++ 在cpp文件中实现非模板类的模板成员
我有一门课:C++ 在cpp文件中实现非模板类的模板成员,c++,templates,C++,Templates,我有一门课: // A.h class A { void foo(); template <class T> void bar( T someVar ); } #include "A.tcpp" //A.h 甲级 { void foo(); 模板空心条(T-someVar); } #包括“A.tcpp” 当我构建它时,我会得到链接器错误。但是,如果整个类都是一个模板,那么上面的示例将构建得非常好。所以我的问题是: 当使用模板成员函数而不是模板类时,我如何坚持在c
// A.h
class A
{
void foo();
template <class T> void bar( T someVar );
}
#include "A.tcpp"
//A.h
甲级
{
void foo();
模板空心条(T-someVar);
}
#包括“A.tcpp”
当我构建它时,我会得到链接器错误。但是,如果整个类都是一个模板,那么上面的示例将构建得非常好。所以我的问题是:
当使用模板成员函数而不是模板类时,我如何坚持在cpp文件中使用所有定义的模式?我找到了解决方案,它没有我想要的那么好,但在我的情况下就可以了。我们可以在tcpp文件的末尾插入以下行:
template void A::bar<int>( int );
// And so on, for all types that should be supported.
模板void A::bar(int);
//依此类推,适用于所有应支持的类型。
它被称为。我找到了解决方案,它没有我想要的那么好,但在我的情况下就可以了。我们可以在tcpp文件的末尾插入以下行:
template void A::bar<int>( int );
// And so on, for all types that should be supported.
模板void A::bar(int);
//依此类推,适用于所有应支持的类型。
如果要将具有模板函数和非模板函数的类拆分为头文件和tcpp文件,则只将模板定义放入tcpp文件中。非模板定义仍需要放入常规cpp文件中 将非模板代码放在tcpp文件中会将其包含回头文件中,这意味着它会在包含在其中的每个翻译单元中定义 在这种情况下,这意味着你应该
// A.h
class A
{
void foo();
template <class T> void bar( T someVar );
}
#include "A.tcpp"
// A.tcpp
template <class T> void A::bar( T someVar ) { some code; }
// A.cpp
#include "A.h"
void A::foo() { some code; }
//A.h
甲级
{
void foo();
模板空心条(T-someVar);
}
#包括“A.tcpp”
//A.tcpp
模板void A::bar(T someVar){some code;}
//A.cpp
#包括“A.h”
void A::foo(){some code;}
如果要将具有模板函数和非模板函数的类拆分为头文件和tcpp文件,则只将模板定义放在tcpp文件中。非模板定义仍需要放入常规cpp文件中
将非模板代码放在tcpp文件中会将其包含回头文件中,这意味着它会在包含在其中的每个翻译单元中定义
在这种情况下,这意味着你应该
// A.h
class A
{
void foo();
template <class T> void bar( T someVar );
}
#include "A.tcpp"
// A.tcpp
template <class T> void A::bar( T someVar ) { some code; }
// A.cpp
#include "A.h"
void A::foo() { some code; }
//A.h
甲级
{
void foo();
模板空心条(T-someVar);
}
#包括“A.tcpp”
//A.tcpp
模板void A::bar(T someVar){some code;}
//A.cpp
#包括“A.h”
void A::foo(){some code;}
@drescherjm,因为项目遵循这种模式,正如这里所解释的:在执行过程中包括cpp,但不要编译它。我还建议使用另一个扩展名(因为它不太重要)。inc或.inl都很好。@Aram是的,实际上我叫它们.tcpp,但不想在这里混淆太多。你是什么意思,不要编译它?@drescherjm我希望得到一个不同的答案,但如果是这样的话,我就不得不这么做了。现在通过编辑,我假设在这种情况下,.tcpp
文件在你的项目中的编译方式与.cpp
文件不同。您是否在.cpp
文件中实现了foo()
,而不是在.tcpp
文件中实现了它?@drescherjm,因为项目遵循这种模式,如下所述:按您正在做的方式包含cpp,但不编译它。我还建议使用另一个扩展名(因为它不太重要)。inc或.inl都很好。@Aram是的,实际上我叫它们.tcpp,但不想在这里混淆太多。你是什么意思,不要编译它?@drescherjm我希望得到一个不同的答案,但如果是这样的话,我就不得不这么做了。现在通过编辑,我假设在这种情况下,.tcpp
文件在你的项目中的编译方式与.cpp
文件不同。您是否在.cpp
文件而不是.tcpp
文件中实现了foo()
!谢谢!太好了,这比我刚想出的解决方案还要好!谢谢!