请求非类型的会员

时间:2013-05-03 16:59:43

标签: c++ reference undefined

我收到此错误,我无法独自解决

source.cpp:85:8: error: request for member ‘put_tag’ in ‘aux’, which is of non-class type ‘Keyword()’
source.cpp:86:8: error: request for member ‘put_site’ in ‘aux’, which is of non-class type ‘Keyword()’
make: *** [source.o] Error 1

给我这个错误的代码是

Keyword aux();
aux.put_tag(word);
aux.put_site(site);

我必须提到单词和网站是char *类型

现在,我的关键字类定义就是这个:

class Keyword{
 private:

std::string tag; 
Stack<std::string> weblist;

public:

    Keyword();
    ~Keyword();
    void put_tag(std::string word)
    {
        tag = word;
    }
    void put_site(std::string site)
    {
        weblist.push(site);
    }

};

非常感谢!

更新

修改

Keyword aux();
aux.put_tag(word);
aux.put_site(site);

Keyword aux;
aux.put_tag(word);
aux.put_site(site);

我收到了这个错误:

source.o: In function `Algorithm::indexSite(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
source.cpp:(.text+0x2c6): undefined reference to `Keyword::Keyword()'
source.cpp:(.text+0x369): undefined reference to `Keyword::~Keyword()'
source.cpp:(.text+0x4a8): undefined reference to `Keyword::~Keyword()'
source.o: In function `Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
source.cpp:(.text._ZN7Keyword8put_siteESs[Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x2a): undefined reference to `Stack<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::push(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [tema3] Error 1

3 个答案:

答案 0 :(得分:17)

这一行不符合您的想法:

Keyword aux();

声明名为aux函数不带参数并返回Keyword。你最有可能写(没有括号):

Keyword aux;

其中声明类型为Keyword对象

<强>更新

关于您遇到的下一个错误,这是因为您有类的构造函数和析构函数的声明,而不是定义。实际上,您获得的错误来自链接器,而不是来自编译器。

要提供构造函数和析构函数的简单定义,请更改:

Keyword();
~Keyword();

进入这个:

Keyword() { }
~Keyword() { }

或者,只要这些成员函数什么也不做,只要省略它们 - 编译器就会为你生成它们(除非你添加一些其他用户声明的构造函数,对于构造函数的内容)。

答案 1 :(得分:3)

不是这个

Keyword aux();
aux.put_tag(word);
aux.put_site(site);

但是这个

Keyword aux;
aux.put_tag(word);
aux.put_site(site);

在您的版本Keyword aux();中,函数原型不是变量声明。

答案 2 :(得分:0)

当我在主函数中输入以下代码时遇到同样的问题,我有一个List.h和List.cpp文件包含我的List类。

List<int,int> myList();
bool x=myList.isEmpty();

我收到错误的&#34;请求会员&#39; isEmpty&#39; in&#39; myList&#39;,这是非类型&#39; List()&#39;&#34;

错误是因为编译器将myList()视为函数原型

当我将代码更正为

List<int,int> myList;
bool x=myList.isEmpty();

我得到了错误&#34;未定义的引用`List :: List()&#34;析构函数有几个类似的错误。

在此页面中进一步检查我的代码和答案我发现我必须在main.cpp中包含我的List.cpp文件,但是我在List.cpp文件中包含List.h但似乎此信息必须包含被告知主文件。 进一步阅读this tutorial解释了为什么,如果我在不包含List.cpp的情况下编译项目,它将编译正常,因为List.h文件具有原型,但它会在链接器阶段失败,因为链接器将无法解析对特定函数的List()调用。