微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模板函数可以访问不完整类型的字段吗?这是有效的吗?

如何解决模板函数可以访问不完整类型的字段吗?这是有效的吗?

我会尽可能清楚地描述这一点。如果只有前向声明,通常无法访问结构的内部数据字段。它会给出一个编译器错误,因为结构体的完整定义尚不清楚(不完整的类型)。

然而,我在下面制作的最小示例似乎表明模板函数可以访问仍然是不完整类型的结构:

#include <string>

template <typename T>
void template_setName(T *t)
{
  // Valid,but no struct declaration at this point by the time it is called???
  t->name = "Bob";
}

struct User;

void setName(User *u)
{
  // Invalid,only have forward declare at this point.
  //u->name = "Bob";

  // User* is fine as opaque pointer but this following function will
  // access a field...
  template_setName(u);
}

// Actually declare structure here. No function above should be able to
// access the data.
struct User
{
  std::string name;
};

int main()
{
  User u;
  setName(&u);

  return 0;
}

这让我相信这是未定义的行为?也许我正在使用的这个特定的编译器碰巧在最后从模板生成了具体的代码,在它全部被声明之后?我已经在我可以使用的每个编译器(g++、clang++、cl、suncc)上都试过了,它们都编译和运行没有问题,所以我只是想我应该检查一下。

作为说明,我知道模板函数可以在结构之前定义,因为模板可以对任何替代为模板参数的类型进行操作。我感到惊讶的是,我从一个它仍然不知道结构的地方调用模板函数。此时是一个不透明的指针。

非常感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。