VC++模板编译器错误 C2244:无法将函数定义与现有声明匹配

发布于 2024-11-17 06:18:56 字数 1013 浏览 1 评论 0原文

我在使用 Visual Studio 2010 时遇到了编译器错误,我已将其简化为以下代码:

template <int i> struct A
{
    typedef int T;
};

template<int i>
struct B
{
    static const int i = i; // <-- this seems to cause the problem
    typename A<i>::T F();
};


template<int i>
typename A<i>::T B<i>::F()       { return B<i>::i; }

此代码产生此错误:

repro.cpp(15): error C2244: 'B<i>::F' : unable to match function definition to an existing declaration
repro.cpp(12) : see declaration of 'B<i>::F'
      definition
      'A<i>::T B<i>::F(void)'
      existing declarations
      'A<i>::T B<i>::F(void)'

如果在 struct B 中声明 i删除后编译器错误就会消失。我相信这是因为 F 返回类型的模板参数绑定到 B 中的静态成员 i 而不是 B< /code> 的模板参数。当 i 的值相同时,为什么 F 的返回类型会“不同”?这是一个错误吗?

我还应该提到,如果函数被声明为内联,错误就会消失。

I've encountered a compiler error using Visual Studio 2010 which I've reduced down to the following code:

template <int i> struct A
{
    typedef int T;
};

template<int i>
struct B
{
    static const int i = i; // <-- this seems to cause the problem
    typename A<i>::T F();
};


template<int i>
typename A<i>::T B<i>::F()       { return B<i>::i; }

This code produces this error:

repro.cpp(15): error C2244: 'B<i>::F' : unable to match function definition to an existing declaration
repro.cpp(12) : see declaration of 'B<i>::F'
      definition
      'A<i>::T B<i>::F(void)'
      existing declarations
      'A<i>::T B<i>::F(void)'

If the declaration for i in struct B is removed the compiler error goes away. I believe it's because the template parameter for the return type of F is binding to the static member i within B instead of B's template argument. Why do the return types for F 'differ' when the value for i is the same? Is this a bug?

I should also mention that if the function is declared inline the error goes away.

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

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

发布评论

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

评论(1

眼泪也成诗 2024-11-24 06:18:56

问题是您在同一范围内两次声明相同的名称。如果您重命名 static const int i 或模板参数,它应该可以工作。

The problem is you are declaring the same name twice in the same scope. If you rename the static const int i, or the template parameter it should work.

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