Boost logo

Boost :

From: rwgk_at_[hidden]
Date: 2001-05-16 20:46:12

This posting is related to the thread

Attached is a bug report that I sent to Compaq, and a
response. I am very interested to hear what the authors
of the C++ standard think about the problem.

Date: Tue, 15 May 2001 11:14:56 -0700 (PDT)
From: "Ralf W. Grosse-Kunstleve" <rwgk_at_c...>
To: compaq_cxx_at_[hidden]
Subject: cxx_bugreport: problem with friend functions in a class

==================== C++ Problem Reporting Template

Problem description:

friend functions in a class template are instantiated correctly
but the declaration is not visible:

% cat simple.cpp
#include <iostream>

template <class T>
struct group_of_friends {
  friend T foo1(const T& v) { return v * 2; }
  friend T foo2(const T& v) {
    T foo1(const T& v);
    return foo1(v);

int main() {
  group_of_friends<int> f;
  int foo2(const int& v);
  std::cout << foo2(123) << std::endl;
  return 0;

% cxx -std strict_ansi -o simple simple.cpp
cxx: Error: simple.cpp, line 10: identifier "foo1" is undefined
          detected during instantiation of class
                    "group_of_friends<T> [with T=int]" at line 15
    return foo1(v);
cxx: Error: simple.cpp, line 19: identifier "foo2" is undefined
  std::cout << foo2(123) << std::endl;
cxx: Info: 2 errors detected in the compilation of "simple.cpp".

Any additional information that we need to know:

The same code compiles fine with:
    Compaq C++ V6.2-024 for Digital UNIX V5.0 (Rev. 910)
    gcc version 2.95.2
    MIPSpro Compilers: Version
    Visual C++ 6.0 Service Pack 4

Have you found a workaround for this problem? [X] Yes [ ] No
If 'yes', please describe the workaround.

% cxx -std strict_ansi -o simple simple.cpp -DWORKAROUND
% simple

------------------------- System Information -------------------------

cxx -V
Compaq C++ V6.3-008 for Compaq Tru64 UNIX V5.0A (Rev. 1094)
Compiler Driver V6.3-008 (cxx) cxx Driver

/usr/sbin/sizer -v
Compaq Tru64 UNIX V5.0A (Rev. 1094); Sat Jul 29 14:03:15 2000

Date: Wed, 16 May 2001 21:17:42 -0400
From: cxxc_bugs_at_[hidden]
To: rwgk_at_c...
Subject: Re: CPP#5241: Subj: cxx_bugreport: problem with friend
functions in a clas

Compaq C++ is one of the most standard conforming compilers
available. The
"-std strict_ansi" switch tells the compiler to strictly conform to

It is very common for code to be accepted as correct with other
compilers, but
not Compaq C++, particularly when strict conformance is requested.

This code will compile with the "-D__USE_STD_IOSTREAM" switch which
request a
standards compliant IOSTREAMS library, not is not as strict with your

So is the diagnostic correct or not? The following is from the ISO
C++ standard:

11.4 Friends 11 Member access control

3 A function first declared in a friend declaration has external
linkage (3.5).
its previous linkage (7.1.1).ns

5 A function can be defined in a friend declaration of a class if and
only if the
the function name is unqualified, and the
function has namespace scope.

  class M {
    friend void f() { } // definition of global f, a friend of M,
                        // not the definition of a member function
—end example] S

Such a function is implicitly inline. A friend function defined in a
class is in
(lexical) scope of the class in which it is defined. A friend function
defined outside the class is not (3.4.1).

The sentense "and the function has namespace scope" makes me wonder
if the
function has to be declared first, however, that would make statement
unnecessary. The following does work:> cxx -c -std strict_ansi t.cxx -DOK> cat t.cxx
typedef int T;

#ifdef OK
T foo1(const T& v);
T foo2(const T& v);

struct group_of_friends {
  friend T foo1(const T& v) { return v * 2; }
  friend T foo2(const T& v) { return foo1(v); }

int main() {
  group_of_friends f;

  return 0;

We are going to have to review this further and get back to you.

Please send all Compaq C/C++ Support requests to
Reply to this message for further correspondence regarding THIS
request. Thank you for choosing Compaq C/C++.

Boost list run by bdawes at, gregod at, cpdaniel at, john at