1

如果我在 C++ 中对返回类型的函数进行模板化:

template<class T> T foo(int x) { };

我可以使用显式模板特化来创建一个double实例:

template<> double foo<double>(int x) { };

我尝试使用前向声明来创建 undefined 的实例struct

struct bar;
template<> bar foo<bar>(int x) { }

这失败了error: return type ‘struct bar’ is incomplete。我认为这是允许的,即使在阅读了关于何时使用前向声明的公认答案?因为,在我创建 的实例之前foo<bar>,永远不会创建显式模板化代码。显然情况并非如此(为什么不呢?)。

是否可以为编译时类型可能不存在的函数编写代码,并且仅在特定显式特化被实例化时才编译代码?这样做的动机是“重载”结构阅读器,其中重载操作是在编译之前按程序生成的(通过脚本)。

4

2 回答 2

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函数体中,您需要知道该结构的大小,这就是您的代码不起作用的原因。

于 2012-06-11T16:09:35.093 回答
2

当您定义函数的特化时,您定义的是函数,而不是函数模板。此时的规则与任何常规函数完全相同,并且因为您以需要完整类型的方式使用类型,所以缺少定义bar会使您的程序格式错误。

(缺少 return 语句也使程序格式错误......)

于 2012-06-11T16:10:47.900 回答