-1

我在 linux 上使用 Clang 3.3 编译一段 C++ 代码时遇到了一些麻烦。但是,同一段代码可以使用 gcc 4.8.2 以及 Intel 编译器进行编译。所以我想我的代码是否真的合法。通常我更相信叮当这些问题;)

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

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 中的错误发布还是实际上格式不正确?

提前致谢, 拉斐尔

4

1 回答 1

0
  1. 很高兴看到您在使用 clang 时实际遇到了什么错误。

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

  3. 以下是您应该如何处理模板朋友

按照那里给出的建议,这是我修复代码的方法:

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) 一起编译。

于 2013-11-01T16:57:29.327 回答