如果我在返回类型上用C ++模板化函数:
template<class T> T foo(int x) { };
我可以使用显式模板特化来创建double
实例:
template<> double foo<double>(int x) { };
我尝试使用前向声明来创建未定义struct
的实例:
struct bar;
template<> bar foo<bar>(int x) { }
error: return type ‘struct bar’ is incomplete
失败。我思考即使在When to use forward declaration?上阅读了已接受的答案之后,这也是允许的,直到我创建foo<bar>
的实例,才会创建显式的模板化代码。显然情况并非如此(为什么不呢?)。
是否可以为编译时类型可能不存在的函数提供代码,并且只有在实例化特定的显式特化时才编译代码?其动机是“重载”结构阅读器,其中重载操作在编译之前(通过脚本)在程序上生成。
答案 0 :(得分:2)
如果您不提供foo
功能的正文:
// some header file, probably
struct bar;
template<> bar foo<bar>(int x);
// somewhere else:
struct bar {
//blabla
};
// the actual implementation
template<> bar foo<bar>(int x) {
// do something
}
只有在您实际上不需要bar
的定义时,前向声明才有效。在foo
函数的正文中,您需要知道该结构的大小,这就是您的代码无效的原因。
答案 1 :(得分:2)
当您定义函数的特化时,您正在定义函数,而不是函数模板。此时的规则与任何常规函数完全相同,并且因为您以需要完整类型的方式使用该类型,因此缺少bar
的定义会使您的程序格式错误。
(缺少退货声明也会导致程序格式不正确......)