http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52065

Keean Schupke <ke...@fry-it.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ke...@fry-it.com
            Summary|template function of        |Declaring template friend
                   |template class s;e          |function of template class
                   |                            |breaks template type
                   |                            |inference.

--- Comment #1 from Keean Schupke <ke...@fry-it.com> 2012-01-31 12:49:18 UTC ---
/* g++ (Gentoo 4.6.2 p1.2, pie-0.5.0) 4.6.2
 *
 * Linux Orac 3.0.0-gentoo #1 SMP Wed Oct 26 10:56:22 BST 2011 x86_64 Intel(R)
Xeon(R) CPU X5570 @ 2.93GHz GenuineIntel GNU/Linux
 *
 * $ /var/tmp/portage/sys-devel/gcc-4.6.2/work/gcc-4.6.2/configure
--prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/4.6.2
--includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.2/include
--datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.6.2
--mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/4.6.2/man
--infodir=/usr/share/gcc-data/x86_64-pc linux-gnu/4.6.2/info
--with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.2/include/g++-v4
--host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-altivec
--disable-fixed-point --without-ppl --without-cloog --enable-lto --enable-nls
--without-included-gettext --with-system-zlib --disable-werror
--enable-secureplt --enable-multilib --enable-libmudflap --disable-libssp
--enable-libgomp
--with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/4.6.2/python
--enable-checking=release --enable-java-awt=gtk --disable-libquadmath
--enable-languages=c,c++,java --enable-shared --enable-threads=posix
--enable-__cxa_atexit --enable-clocale=gnu --enable-targets=all
--with-bugurl=http://bugs.gentoo.org/ --with-pkgversion=Gentoo 4.6.2 p1.3,
pie-0.5.0
 *
 * g++ "thisfile.cpp"
 *
 * /tmp/.private/keean/ccl1iwQk.o: In function `main':
 * t.cpp:(.text+0x26): undefined reference to `void f<char>(A<char const*>,
char)'
 * collect2: ld returned 1 exit status
 * 
 * We have a function template which we want to allow access to the private
 * data of an object. The function template works fine just using the public
 * interface of the object, but adding the friend declaration seems to break
 * the type inference when the template function is called.
 * I can get this to compile by changing the friend definition to:
 *
 * template <typename TT, typename T2> friend void f(A<TT>, T2);
 *
 * However this does not mean the same thing as nothing is constraining
 * TT == T so this would in fact allow private access to instances of 'f'
 * of _all_ types of A<*> not just the ones where the type first type parameter
 * is the same type as the type parameter of the template object.
 */

template <typename T> struct A;

template <typename T, typename T2> void f(A<T> a, T2 b) {
    a.t = b;
}

template <typename T> struct A {
    A(T a) {t = a;}
    template <typename T2> friend void f(A<T>, T2);
    //template <typename TT, typename T2> friend void f(A<TT>, T2);
private:
    T t;
};

int main() {
    A<int> a(1);
    f(a, 2.1);
}

Reply via email to