关于在命名空间内的模板类的前置声明

时间:2022-04-22 20:01:38
我在命名空间xxx中写了个模板类在其他类中需要用到这个类,在其他类中要怎么声明这个模板类?
具体如下:
文件xxx.h中有一个模板类:

namespace
{
template <typename T>
class MyTemplateClass
{
//................
}
}


然后我在其他类中需要用到这个类,我的前置声明写成下面这样,但是编译不通过,undefined class xxxxx

//这里声明
namespace
{
template <typename T> class MyTemplateClass; 
}

class xxxx
{
public:
MyTemplateClass<float> xxx; //编译不通过
}

8 个解决方案

#1


模板单独定义在一个.h里,然后大家都include这个.h

#2


你确定你包含了头文件?

#3


引用 1 楼 truelance 的回复:
模板单独定义在一个.h里,然后大家都include这个.h

就是不想include,然后修改一下所有include了这个文件的都重编,只是想在类的头文件中声明

#4


引用 2 楼 fztfztfzt 的回复:
你确定你包含了头文件?

我的意思是我在其他类的头文件中要定义一个这个模板类类型的变量,我只想先在这个头文件中声明,在cpp中去include,但是用这样的方式声明,定义类型那里还是编译不通过。
//这里声明
namespace
{
template <typename T> class MyTemplateClass; 
}

 

#5


模板不支持分离编译,类模板的定义和声明要写在一个文件中,其他编译单元包含的时候也需要把定义和声明同时包含进来。不同编译单元中的匿名名字空间不属于同一个名字空间,虽然他们都是匿名的。

#6


MyTemplateClass<float> xxx; //编译不通过

到这一行时,编译器必须知道MyTemplateClass这个类模板的完整定义,所以必须#include。除非你用指针、引用什么的只需要声明就行了,这个问题跟模板无关。

#7


引用 4 楼 gssnail 的回复:
Quote: 引用 2 楼 fztfztfzt 的回复:

你确定你包含了头文件?

我的意思是我在其他类的头文件中要定义一个这个模板类类型的变量,我只想先在这个头文件中声明,在cpp中去include,但是用这样的方式声明,定义类型那里还是编译不通过。
//这里声明
namespace
{
template <typename T> class MyTemplateClass; 
}

 

我这可以啊:
temtestA.h
template<typename T>
class A
{
public:
T a;
};

temtestB.h
template<typename T> class A;
class B
{
public:
A<int> a;
};

都没问题啊

#8


找到了,c++prime 第四版 643页,模版编译模型,-----看编译器的这个,2中编译模型:包含编译模型和分别编译模型

#1


模板单独定义在一个.h里,然后大家都include这个.h

#2


你确定你包含了头文件?

#3


引用 1 楼 truelance 的回复:
模板单独定义在一个.h里,然后大家都include这个.h

就是不想include,然后修改一下所有include了这个文件的都重编,只是想在类的头文件中声明

#4


引用 2 楼 fztfztfzt 的回复:
你确定你包含了头文件?

我的意思是我在其他类的头文件中要定义一个这个模板类类型的变量,我只想先在这个头文件中声明,在cpp中去include,但是用这样的方式声明,定义类型那里还是编译不通过。
//这里声明
namespace
{
template <typename T> class MyTemplateClass; 
}

 

#5


模板不支持分离编译,类模板的定义和声明要写在一个文件中,其他编译单元包含的时候也需要把定义和声明同时包含进来。不同编译单元中的匿名名字空间不属于同一个名字空间,虽然他们都是匿名的。

#6


MyTemplateClass<float> xxx; //编译不通过

到这一行时,编译器必须知道MyTemplateClass这个类模板的完整定义,所以必须#include。除非你用指针、引用什么的只需要声明就行了,这个问题跟模板无关。

#7


引用 4 楼 gssnail 的回复:
Quote: 引用 2 楼 fztfztfzt 的回复:

你确定你包含了头文件?

我的意思是我在其他类的头文件中要定义一个这个模板类类型的变量,我只想先在这个头文件中声明,在cpp中去include,但是用这样的方式声明,定义类型那里还是编译不通过。
//这里声明
namespace
{
template <typename T> class MyTemplateClass; 
}

 

我这可以啊:
temtestA.h
template<typename T>
class A
{
public:
T a;
};

temtestB.h
template<typename T> class A;
class B
{
public:
A<int> a;
};

都没问题啊

#8


找到了,c++prime 第四版 643页,模版编译模型,-----看编译器的这个,2中编译模型:包含编译模型和分别编译模型