Skip to content

Move all operator<< overloads out of the global namespace.#10546

Closed
ezyang wants to merge 1 commit intopytorch:masterfrom
ezyang:export-D9344540
Closed

Move all operator<< overloads out of the global namespace.#10546
ezyang wants to merge 1 commit intopytorch:masterfrom
ezyang:export-D9344540

Conversation

@ezyang
Copy link
Contributor

@ezyang ezyang commented Aug 15, 2018

Summary:
Have you ever written an operator<< overload in the caffe2 namespace
in a core Caffe2 header, and then been stunned when some completely
unrelated code started breaking? This diff fixes this problem!

The problem looks like this:

  1. You're building against a really old version of glog (think 0.3.2,
    or something like that)
  2. This version of glog defines operator<< overloads for std containers
    in the global namespace
  3. You add a new overload in your current namespace (e.g., caffe2).
    Congratulations: this overload is preferentially chosen over
    the global namespace one for all calls to << in that namespace.
    And since it doesn't actually have std::vector overloads, unrelated
    Caffe2 code breaks.

Newer versions of glog have a fix for this: they have the line:

namespace std { using ::operator<<; }

in their header. So let's help old versions of glog out and do this ourselves.

In our new world order, operator<< overloads defined in the global namespace
won't work (unless they're for std containers, which work because of ADL).
So this diff also moves all those overloads to the correct namespace.

Differential Revision: D9344540

…0546)

Summary:
Pull Request resolved: pytorch#10546

Have you ever written an operator<< overload in the caffe2 namespace
in a core Caffe2 header, and then been stunned when some completely
unrelated code started breaking?  This diff fixes this problem!

The problem looks like this:
1. You're building against a really old version of glog (think 0.3.2,
   or something like that)
2. This version of glog defines operator<< overloads for std containers
   in the global namespace
3. You add a new overload in your current namespace (e.g., caffe2).
   Congratulations: this overload is *preferentially* chosen over
   the global namespace one for all calls to << in that namespace.
   And since it doesn't actually have std::vector overloads, unrelated
   Caffe2 code breaks.

Newer versions of glog have a fix for this: they have the line:

  namespace std { using ::operator<<; }

in their header.  So let's help old versions of glog out and do this ourselves.

In our new world order, operator<< overloads defined in the global namespace
won't work (unless they're for std containers, which work because of ADL).
So this diff also moves all those overloads to the correct namespace.

Differential Revision: D9344540

fbshipit-source-id: 2ed9bf24ed1d7e67ba568bceb533c8589e020b31
zdevito pushed a commit to zdevito/ATen that referenced this pull request Aug 16, 2018
Summary:
Pull Request resolved: pytorch/pytorch#10546

Have you ever written an operator<< overload in the caffe2 namespace
in a core Caffe2 header, and then been stunned when some completely
unrelated code started breaking?  This diff fixes this problem!

The problem looks like this:
1. You're building against a really old version of glog (think 0.3.2,
   or something like that)
2. This version of glog defines operator<< overloads for std containers
   in the global namespace
3. You add a new overload in your current namespace (e.g., caffe2).
   Congratulations: this overload is *preferentially* chosen over
   the global namespace one for all calls to << in that namespace.
   And since it doesn't actually have std::vector overloads, unrelated
   Caffe2 code breaks.

Newer versions of glog have a fix for this: they have the line:

  namespace std { using ::operator<<; }

in their header.  So let's help old versions of glog out and do this ourselves.

In our new world order, operator<< overloads defined in the global namespace
won't work (unless they're for std containers, which work because of ADL).
So this diff also moves all those overloads to the correct namespace.

Reviewed By: dzhulgakov

Differential Revision: D9344540

fbshipit-source-id: 6246ed50b86312668ebbd7b039fcd1233a3609cf
@ezyang ezyang added the merged label Jun 26, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants