Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在cpp文件中实现非模板类的模板成员_C++_Templates - Fatal编程技术网

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()
!谢谢!太好了,这比我刚想出的解决方案还要好!谢谢!