是否可以使用C ++模板来避免链接到包含最终未被调用的函数的库?例如,使用以下代码:
template <typename T>
struct Foo {
void bar() { zod(); }
};
int main(int argc, char *argv[])
{
return 0;
}
GCC 4.5将拒绝它: 错误:'zod'没有依赖于模板参数的参数,因此'zod'的声明必须可用 注意:(如果使用'-fpermissive',G ++将接受您的代码,但不允许使用未声明的名称)
标准是强制性的错误吗?有没有办法使用模板来实现这一目标;所以避免使用cpp宏。
答案 0 :(得分:4)
我认为你将链接与为zod()
提供原型混淆(即声明,例如通过包含头文件)。
许多实现很乐意编译和链接具有inline
函数(或模板)的程序,这些函数在没有定义的情况下调用函数。所以,这很好用(至少MSVC 10,GCC 4.3和GCC 4.5):
void zod(); // we need the declaration, but no definition
inline void bar() { zod(); }
int main(int argc, char *argv[])
{
return 0;
}
我不确定标准是否要求它。当然,只要模板永远不会被实例化,它也应该使用模板而不是inline
。
答案 1 :(得分:2)
正如错误所暗示的,如果zod()
依赖于模板参数,那么SFINAE会将此视为非问题。
目前,必须提供zod
声明。遗憾。
如果您控制了zod
并且不介意向其添加虚拟参数,则可以执行以下操作:
template <typename T, T dummy>
struct Foo {
void bar() { zod(dummy()); }
};
int main(int argc, char *argv[])
{
return 0;
}
但是......主要的新人。
答案 2 :(得分:1)
您的示例中没有显示任何需要代码专业化的内容。在这种情况下,您可以简单地声明函数inline
。
也许还有更多我没有看到的问题;如果是,请编辑问题并提供更多详细信息。