模板而不是cpp预处理器,以避免链接?

时间:2011-04-23 00:20:10

标签: c++ templates linker

是否可以使用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宏。

3 个答案:

答案 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

也许还有更多我没有看到的问题;如果是,请编辑问题并提供更多详细信息。