-1

Linux で Clang 3.3 を使用して C++ コードをコンパイルするのに問題があります。ただし、同じコードは gcc 4.8.2 および Intel Compiler でコンパイルされます。したがって、私のコードが実際に合法であるかどうかを知りたかったのです。通常、私はそのような質問でclangをより信頼しています;)

とにかく、コードフラグメントは次のとおりです。

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 (トランク) の両方でコンパイルされます。

于 2013-11-01T16:57:29.327 に答える