【问题标题】:Error when trying to call a method: request for a member which is of a non-class type尝试调用方法时出错:请求非类类型的成员
【发布时间】:2013-11-18 07:34:05
【问题描述】:

我有一个名为“播放器”的类,我必须在我的项目中使用它,它看起来像这样:

template<typename F>
class player {
public:
  int play(const F &field);
};

现在我想在我的游戏中使用“play”函数,我尝试这样调用它:

player<Game> player2();
player2.play(this);

我收到以下错误:

error: request for member 'play' in 'player2', 
which is of non-class type 'player<Game>()'

我不知道为什么会这样,我对其他班级做过类似的事情,而且效果很好...... 有人可以帮我吗? (我用的是eclipse和mingw gcc)

编辑:

好的,现在一切正常。非常感谢。

【问题讨论】:

  • 我相信因为 player2 被解析为函数。
  • player2() 改为简单的player2
  • 你现在已经在 StackOverflow 的同一页面上问了几个完全不同的问题 :)
  • “未定义引用”错误是涉及模板时的经典 C++ 问题。只需搜索“未定义的参考 c++ 模板”

标签: c++ class templates gcc compiler-errors


【解决方案1】:

这段代码:

player<Game> player2();

是函数player2 的声明,它不接受任何参数并返回player&lt;Game&gt; 作为值。将其更改为:

player<Game> player2;

注意,它以前对你有用,因为你使用了带有类似参数的构造函数:

Foobar foo( 123 );

在这种情况下,它不能被解释为函数声明并按预期工作。

编辑: 方法

int play(const F &field);

期望一个 const 引用 ot 类型 F,你试图传递的是一个指针。你可能应该取消引用this

player2.play(*this);

【讨论】:

  • 此外,他必须取消引用 this 才能匹配类型。但一次只有一条错误消息...
  • 好的,谢谢大家。我将 ist 更改为: player player2; player2.play(这个);现在我收到以下错误:“未定义对 `player::play(Game const*)' 的引用”
  • @Ben play 期望获得您试图传递 const 指针的 const 引用。我假设您需要将*this 作为参数。
  • @Slava 我之前犯了一个小错误,那是错误的错误信息。当使用“*this”时,我实际上在使用“this”时遇到了与以前相同的错误:“undefined reference to `player::play(Game const&)'”我在原始帖子中编辑了代码
  • @Ben 你必须实现功能。因为它是一个模板函数,所以它的实现应该在你使用它的地方可见,或者你必须显式地实例化它。
【解决方案2】:

play 的参数必须是 Game 类型而不是 player 类型。

Game myGame;
player<Game> player2;
player2.play(myGame);

应该可以。

【讨论】:

  • 我实际上在“Game”类中调用了该函数,但是如果我使用“this”作为参数,我会得到“对 `player::play(Game const*) 的未定义引用” "
  • 好的,你应该使用 player2.play(*this);因为“this”是指向游戏对象的指针,而不是对游戏对象的引用,就像“*this”一样。
猜你喜欢
  • 1970-01-01
  • 2018-02-01
  • 2019-04-28
  • 1970-01-01
  • 2010-10-27
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多