在使用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中的错误发布还是实际上形成不良?
先谢谢, 拉斐尔
答案 0 :(得分:0)
很高兴看到你用clang实际得到了什么错误。
您发布的代码中有很多噪音,部分是 与问题无关。
以下是您应该如何处理template friends。
根据那里给出的建议,以下是我修复代码的方法:
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)编译。