来自模板特殊结构的朋友方法:g ++和clang ++不同的行为

时间:2017-01-29 21:00:54

标签: c++ g++ friend template-specialization clang++

试图为another question提出一个解决方案,我(再次)反对编译和使用clang ++(3.5)的代码,但是使用g ++(4.9.2)编译错误

以下是简化的最小化(我希望)示例

#include <iostream>

class foo;

template <std::size_t>
struct bar;

template <>
struct bar<0U>
 { static void baz (foo const & f); };

class foo
 {
    int i = 42;

    template <std::size_t I>
    friend void bar<I>::baz (foo const &);
 };

void bar<0U>::baz (foo const & f)
 { std::cout << f.i << std::endl; }

int main()
 {
    foo f;

    bar<0U>::baz(f);
 }

我的g ++错误是

test_114-98,11,14,clang.cpp:18:41: error: member ‘void bar<<anonymous> >::baz(const foo&)’ declared as friend before type ‘bar<<anonymous> >’ defined
     friend void bar<I>::baz (foo const &);
                                         ^
test_114-98,11,14,clang.cpp: In static member function ‘static void bar<0ul>::baz(const foo&)’:
test_114-98,11,14,clang.cpp:15:13: error: ‘int foo::i’ is private
     int i = 42;
             ^
test_114-98,11,14,clang.cpp:22:19: error: within this context
  { std::cout << f.i << std::endl; }
                   ^
像往常一样,我的问题是:谁是对的,哪些是错的。

0 个答案:

没有答案