2014-11-21 5 views
0

Программа, над которой я сейчас работаю, написана как скрипт, за исключением одного класса, который я использую (или пытаюсь) для связывания 3 переменных с друг друга. У меня есть класс под названием «SupNetModel», который содержит 3 разных значения, без методов класса. Этот класс объявляется как заголовочный файл, поскольку для него не существует каких-либо методов.Возвращение экземпляра класса, выделенного в куче (C++)

#ifndef SUPNETMODEL_H 
#define SUPNETMODEL_H 

class SupNetModel { 
    public: 
     //variables 
     SupNetModel(); 
}; 
#endif 

Сокращенный вариант моей основной функции выглядит следующим образом:

#include "train.h" 
#include "SupNetModel.h" 
int main() { 
    //Some stuff 
    SupNetModel* model = Train(data,labels); 
    return 1; 
} 

Train.cpp выглядит следующим образом

#include "train.h" 
SupNetModel* Train(arma::mat data, arma::mat labels) { 
    SupNetModel * model = new SupNetModel(); 
    //Do a bunch of stuff 
    return model; 
} 

EDIT: Train.h выглядит следующим образом:

#ifndef TRAIN_H 
#define TRAIN_H 

#include <RcppArmadillo.h> 
#include "SupNetModel.h" 

SupNetModel* Train(arma::mat data, arma::mat labels); 
#endif 

Так что, по сути, я пытаюсь t o do - создать экземпляр моего класса в куче, а затем вернуть указатель на этот экземпляр, чтобы я мог получить доступ к нему в основном. Однако в настоящее время я получаю следующую ошибку: «SupNetModel» не называет тип «

Если это актуально, это выполняется с использованием RCpp в среде R. Строка ошибки, на которой ссылаются ошибки, находится в RcppExports.cpp, который автоматически генерируется. При прочтении этого файла (который содержит информацию о классах), похоже, что SupNetModel не отображается в RcppExports, кроме строки для объявления функции Train.

EDIT: Вот часть файла RCppExports, который имеет отношение:

// train 
SupNetModel* train(arma::mat data, arma::mat labels); 
RcppExport SEXP SupervisedNetworks_train(SEXP dataSEXP, SEXP labelsSEXP) { 
BEGIN_RCPP 
    SEXP __sexp_result; 
    { 
     Rcpp::RNGScope __rngScope; 
     Rcpp::traits::input_parameter<arma::mat>::type data(dataSEXP); 
     Rcpp::traits::input_parameter<arma::mat>::type labels(labelsSEXP); 
     SupNetModel* __result = trainNetworkOfNetworks(data, labels); 
     PROTECT(__sexp_result = Rcpp::wrap(__result)); 
    } 
    UNPROTECT(1); 
    return __sexp_result; 
END_RCPP 

}

А вот последние несколько строк, которые возникают при попытке построения проекта:

g++ -I/usr/share/R/include -DNDEBUG -I"/home/anne/LabWork/qpOASES-3.0.0/include" -std=c++11 -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/home/anne/R/x86_64-pc-linux-gnu-library/3.1/RcppArmadillo/include" -fpic -O3 -pipe -g -c LS_LocalLaplacian.cpp -o LS_LocalLaplacian.o 
g++ -I/usr/share/R/include -DNDEBUG -I"/home/anne/LabWork/qpOASES-3.0.0/include" -std=c++11 -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/home/anne/R/x86_64-pc-linux-gnu-library/3.1/RcppArmadillo/include" -fpic -O3 -pipe -g -c RcppExports.cpp -o RcppExports.o 
RcppExports.cpp:241:1: error: ‘SupNetModel’ does not name a type 
SupNetModel* train(arma::mat data, arma::mat labels); 
^ 
RcppExports.cpp: In function ‘SEXPREC* SupervisedNetworks_train(SEXP, SEXP)’: 
RcppExports.cpp:249:9: error: ‘SupNetModel’ was not declared in this scope 
    SupNetModel* __result = train(data, labels); 
     ^
RcppExports.cpp:249:22: error: ‘__result’ was not declared in this scope 
    SupNetModel* __result = train(data, labels); 
       ^
RcppExports.cpp:249:68: error: ‘train’ was not declared in this scope 
    SupNetModel* __result = train(data, labels); 
                   ^
make: *** [RcppExports.o] Error 1 
ERROR: compilation failed for package ‘SupervisedNetworks’ 
* removing ‘/home/anne/R/x86_64-pc-linux-gnu-library/3.1/SupervisedNetworks’ 
* restoring previous ‘/home/anne/R/x86_64-pc-linux-gnu-library/3.1/SupervisedNetworks’ 

Exited with status 1. 

Что вызывает эта ошибка и как, по вашему мнению, ее можно решить?

+0

Это не могло быть вашим файлом заголовка. В конце определения класса отсутствует конечная точка с запятой. Кроме того, это ваша функция main()? Если да, то где '#include" SuperModel.h "?? – PaulMcKenzie

+0

Typo fixed (не было опечатки в моем действительном коде, к сожалению). – Anne

+1

ОК, теперь вам нужно сказать, что такое «Поезд». Вы не сказали 'main', что существует функция' Train'. В C++ все функции должны быть объявлены или определены перед их использованием. – PaulMcKenzie

ответ

1

Похоже, что решение было довольно простым.

Оставленный после проверки функции train(), я оставил тег // [[Rcpp :: export]] над функцией поезда, что позволяет получить доступ к train() R. Удаление этого с ошибкой !

Смежные вопросы