Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ C++;模板申报单_C++_Templates_Gcc - Fatal编程技术网

C++ C++;模板申报单

C++ C++;模板申报单,c++,templates,gcc,C++,Templates,Gcc,我正试图编译一个最小的示例来实例化 模板类。该示例在特定顺序下编译良好 保留了一组声明,否则将失败 温度h: #include <iostream> template <bool display> class test { public: void sayHi(); }; #包括 模板 课堂测试{ 公众: void sayHi(); }; 临时cpp: #include "temp.h" template <bool display>

我正试图编译一个最小的示例来实例化 模板类。该示例在特定顺序下编译良好 保留了一组声明,否则将失败

温度h:

#include <iostream> 
template <bool display>
class test {
    public:
    void sayHi(); 
};
#包括
模板
课堂测试{
公众:
void sayHi();
};
临时cpp:

#include "temp.h"
template <bool display>
void  test<display>::sayHi () {
    if (display) std::cout << "Hi";
}
#包括“温度h”
模板
无效测试::sayHi(){

如果使用模板(display)std::cout,则声明和定义必须在同一个文件中。可以将所有代码放在一个文件中(函数定义是否内联取决于您),或者将声明和定义分开,但将定义文件包含在.h文件底部

是的

tmp.h:

#include <iostream> 
template <bool display>
class test {
    public:
    void sayHi(); 
};

#include "tmp.cpp"
#包括
模板
课堂测试{
公众:
void sayHi();
};
#包括“tmp.cpp”
tmp.cpp和main.cpp保持不变(但您不将tmp.cpp交给编译器进行编译,因为它包含在tmp.h中)


许多人用模板扩展名代替.cpp扩展名的文件名(它让你知道它不是编译的,而且它看起来比包含.cp文件更不奇怪),但是你不必。

见C++ FAQLite条目。


sayHi()
方法的定义(又名正文)必须在temp.h标头中,或者在另一个包含的文件中;当实例化
test

单行摘要时,需要完整的代码:模板不是类型,类型定义必须包含在(至少)一个翻译单元中。(在您的代码中,
test
的类型定义不包含在任何TU中。)
#include <iostream> 
template <bool display>
class test {
    public:
    void sayHi(); 
};

#include "tmp.cpp"