2016-11-13 81 views
0

**在我的主要上我不能添加一个笔记在我的新班级对象TrabalhoC++请求会员,这是非班级类型(使用班级模板时,不能在主要定义)

ass.add_nota(num); 
** 

我的编译出现错误。

我 “Trabalho.h” 代码:

#include <string> 
 
#include <vector> 
 
#include <iostream> 
 
//#include "Enunciado.h" 
 
//#include "Pessoa.h" 
 

 
using namespace std; 
 

 
class Estudante; 
 
class Enunciado; 
 

 
template <class T> 
 
class Trabalho{ 
 
    static int id_auxiliar; 
 
    string texto; 
 
    int ano; 
 
    int id; 
 
    vector<float> calif; 
 
    T* Enun; 
 
    vector<Estudante*> estudantes; 
 
    vector<Enunciado*> enunciados; 
 

 
public: 
 
    Trabalho(); 
 
    Trabalho(string texto, vector<Estudante*> est, T* en, int ano); 
 
    ~Trabalho(); 
 
    void set_texto(string texto); 
 
    string get_texto(); 
 
    void add_nota(float nota); 
 
    void add_enun(Enunciado* en){Enun = en;}; 
 
    int get_id(){return id;}; 
 
    int get_ano() {return ano;}; 
 
    void reutilizar(int id_enun); 
 
    vector<float> get_calif() {return calif;}; 
 
    vector<Estudante*> get_estudantes() {return estudantes;}; 
 
    Enunciado* get_enunciado() {return Enun;}; 
 

 

 

 
}; 
 

 
#endif

而我的主要代码:

int main(int argc, char const *argv[]) { 
 
\t int n; 
 
\t int m; 
 

 
\t Pesquisa ah(); 
 

 
\t float num = 1.1; 
 

 
\t Trabalho<Pesquisa> ass(); 
 
\t Trabalho<Pesquisa>* tass = new Trabalho<Pesquisa>(); 
 

 
\t ass.add_nota(num); 
 
\t tass->add_nota(num);

#ifndef ENUNCIADO_H_ 
 
#define ENUNCIADO_H_ 
 
#include "trabalho.h" 
 
#include "Pessoa.h" 
 
#include <string> 
 

 
using namespace std; 
 

 
class Enunciado 
 
{ 
 
\t static unsigned int id_auxiliar; 
 
\t const unsigned int id; 
 
\t string titulo; 
 
\t string descricao; 
 
\t vector<int> anos_utilizados; 
 
\t static unsigned int max_util; 
 
public: 
 
\t Enunciado(string titulo, string descricao); 
 
\t virtual ~Enunciado(); 
 
\t int get_id(){return id;}; 
 
\t void set_titulo(string titulo); 
 
\t string get_titulo(); 
 
\t void set_descricao(string descricao); 
 
\t string get_descricao(); 
 
\t vector<int> get_anos_utilizados(); 
 
\t void mod_max_util(int a); 
 
}; 
 

 

 

 
class Pesquisa: public Enunciado{ 
 

 
\t vector<string> ref; 
 
public: 
 
\t Pesquisa(string tit, string des, vector<string> refe); 
 

 
}; 
 

 
class Analise: public Enunciado{ 
 
    vector<string> repositorios; 
 
public: 
 
    Analise(string tit, string des, vector<string> repos); 
 
}; 
 

 
class Desenvolvimento: public Enunciado{ 
 

 
public: 
 
\t Desenvolvimento(string tit, string des); 
 

 
}; 
 

 

 
#endif

当我创建一个新的Trabalho当我确定我喜欢的类型(pesquisa是一个类类型上的#include“Enunciado.h”两种方式。

这是出现在两个误差修改:

“描述资源路径位置类型为‘屁股’部件‘add_nota’,其是非类类型的‘Trabalho()’测试 请求。 CPP/Trabalho1/SRC线42 C/C++问题 “

和:

描述资源路径位置类型 无法解决方法'add_nota'Test.cpp/Trabalho1/src line 42语义错误

任何人都可以帮忙吗?

谢谢!

+0

欢迎来到Stackoverflow。请发布一个MCVE示例(http://stackoverflow.com/help/mcve)。你的Trabalho.h不正确(有一个#endif没有对应的#if)。 – jpo38

+0

你的实现在哪里?你如何编译? – jpo38

+0

我没有发布所有代码,因为行数太多 – Azevinho

回答

0

你的错误是在试图调用默认的构造函数

Pesquisa ah(); 

Trabalho<Pesquisa> ass(); 

不幸的是,C++是在这个非常具误导性,它会宣告您的变量assTrabalho<Pesquisa>()类型,其中意思是“零参数函数返回Trabalho<Pesquisa>”,这正是编译器错误所说的:函数类型不是类类型,因此没有成员add_nota。事实上,它看起来完全像一个函数声明,如果你看看这种方式:

int main(); 
^ ^^ 
type arguments 
    name 

这是一个非常常见的错误,特别是对那些从Java背景的。但它也可以很容易地抓住C++程序员的警惕。可以找到更多的信息hereherehere,你可以看到相同的错误信息困扰了很多人。

如果你有一个编译器符合C++ 11种语言的版本,尝试通过

Trabalho<Pesquisa> ass{}; 

更换所有这些现象如果不,刚刚离开

Trabalho<Pesquisa> ass; 

不像在Java中,这样做并不意味着该变量将保持未初始化。这是调用默认(零参数)构造函数的C++方式。

+0

@Azevinho欢迎来到SO。看到你的代码,你可能会知道这个答案中的大部分信息,但本着这个网站的精神,我写这篇文章对那些未来来到这里的人有帮助 - 也许通过搜索你得到的确切错误信息! –

+0

在这一刻,我将file.cpp中的所有内容都移动到了file.h中,并删除了“()”括号,并且它可以平滑地运行所有内容。 编辑:非常感谢队友! – Azevinho

+0

@Azevinho没问题:-)如果答案有帮助,请考虑给它打勾标记;-) –