使用命名空间和朋友声明的模板函数中的自动类型推导在Clang中不起作用

时间:2013-11-01 13:57:13

标签: templates gcc c++11 clang++ friend-function

在使用Linux上的Clang 3.3编译一段C ++代码时遇到了一些麻烦。但是,同一段代码使用gcc 4.8.2以及英特尔编译器进行编译。如果我的代码实际上是合法的,我想要。通常我更信任这些问题;)

无论如何,这里是代码片段:

namespace test {
   template<class SCALAR=double>
    struct Foo {
     public:
      template<class SCALAR_ARG>
      friend Foo<SCALAR_ARG> create_Foo( );

      typedef SCALAR scalar_t;
    };

    template<class SCALAR_ARG=double>
    Foo<SCALAR_ARG> create_Foo( )
    {
      typedef Foo<SCALAR_ARG> impl_t;
      return impl_t();
    }

}

struct Dummy {
  typedef Dummy impl_t;
};

int main() {
  typedef test::Foo<Dummy> foo_t;
  typedef typename foo_t::scalar_t scalar_t;

  Dummy  egv_;
  test::create_Foo();

  return 0;
}
你怎么看?我应该把它作为Clang中的错误发布还是实际上形成不良?

先谢谢, 拉斐尔

1 个答案:

答案 0 :(得分:0)

  1. 很高兴看到你用clang实际得到了什么错误。

  2. 您发布的代码中有很多噪音,部分是 与问题无关。

  3. 以下是您应该如何处理template friends

  4. 根据那里给出的建议,以下是我修复代码的方法:

    namespace test {
    
      template <class > struct Foo;
    
      template <class T=double> Foo<T> create_Foo();
    
      template<class SCALAR=double>
        struct Foo {
        public:
    
          friend Foo create_Foo<>( );
    
          typedef SCALAR scalar_t;
        };
    
        template<class SCALAR_ARG>
        Foo<SCALAR_ARG> create_Foo( )
        {
          typedef Foo<SCALAR_ARG> impl_t;
          return impl_t();
        }
    
    }
    
    struct Dummy {
      typedef Dummy impl_t;
    };
    
    int main() {
      typedef test::Foo<Dummy> foo_t;
      typedef typename foo_t::scalar_t scalar_t;
    
      Dummy  egv_;
      test::create_Foo();
    
      return 0;
    }
    

    它用gcc 4.7.2和clang ++ 3.4(trunk)编译。