编译 MS VC 时出现 GCC 错误++带有模板的代码

发布于 2024-10-16 21:08:08 字数 672 浏览 3 评论 0原文

我们正在获取一些为 Visual Studio 2008 编写的代码,并尝试使用 gcc 对其进行编译。我们在以下代码中遇到了错误(简化为必要的内容):

template<int R, int C, typename T>
struct Vector
{
 template <typename TRes>
 TRes magnitude() const
 {
  return 0;
 }

};

struct A
{
 typedef Vector<3,1,int> NodeVector;
};

template<class T>
struct B
{
 void foo()
 {
  typename T::NodeVector x;
  x.magnitude<double>(); //< error here
 }
};

...
    B<A> test;
    test.foo();

GCC 说

error: expected primary-expression before 'double'
error: expected `;' before 'double'

Can you suggest the error to me?什么是交叉编译器解决方案?

多谢!

we're taking some code written for Visual Studio 2008 and try to compile it with gcc. We experienced an error in the following code (simplified to what's necessary):

template<int R, int C, typename T>
struct Vector
{
 template <typename TRes>
 TRes magnitude() const
 {
  return 0;
 }

};

struct A
{
 typedef Vector<3,1,int> NodeVector;
};

template<class T>
struct B
{
 void foo()
 {
  typename T::NodeVector x;
  x.magnitude<double>(); //< error here
 }
};

...
    B<A> test;
    test.foo();

GCC says

error: expected primary-expression before 'double'
error: expected `;' before 'double'

Can you explain the error to me? What's a cross-compiler solution?

Thanks a lot!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花想c 2024-10-23 21:08:08

问题是,由于 C++ 编译器不知道 T 的实际类型(更不用说 T::NodeVector),它也不知道 magnitude 应该是一个模板,您需要明确指定:

x.template magnitude<double>();

否则 C++ 会将标记解析为 xoperator.magnitudeoperator<doubleoperator>

顺便说一句,GCC 是对的,MSVC++ 在这些问题上是出了名的宽松。

The problem is that since the C++ compiler doesn’t know the actual type of T (let alone T::NodeVector it doesn’t know that magnitude is supposed to be a template. You need to specify that explicitly:

x.template magnitude<double>();

Otherwise C++ will parse the tokens as x, operator., magnitude, operator<, double, operator>

The GCC is right, by the way. MSVC++ is notoriously lax on such matters.

傲世九天 2024-10-23 21:08:08

在 B 点,它无法知道 x 是什么类型,并且该大小将是一个模板函数,因此您需要首先将其声明为 1。

At the point of B it has no way to know what type x is, and that magnitude will be a template function so you need to declare it as one first.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文