2013-03-29 2 views
0

У меня есть следующая программа:не ./a.out не производится в г ++

#include "Sptr.cpp" 
#include <iostream> 
#include <stdio.h> 
#include <assert.h> 

namespace my { 
    template <class T> 
    class Sptr { 
    private: 
     //some kind of pointer 
      //one to current obj 
     T obj; 
     size_t reference_count; 
      //one to original obj 
    public: 
     Sptr(); 

     template <typename U> 
     Sptr(U *); 

     Sptr(const Sptr &); 

     template <typename U> 
     Sptr(const Sptr<U> &); 

     template <typename U> 
     Sptr<T> &operator=(const Sptr<U> &); 

     void reset(); 

     T* operator->() const 
     {return &obj;}; 

     T& operator*() const 
     {return obj;}; 

     T* get() const 
     {return &obj;}; 

     //operator unspecified_bool_type() const; 

     //overload *,->,=,copy-constructor 

     // const-ness should be preserved. 
     // Test for null using safe-bool idiom 
     // Static casting, returns a smart pointer 
    }; 

    template <typename T> 
    Sptr<T>::Sptr() { 
     //do something 
    } 

    template <typename T> 
    template <typename U> 
    Sptr<T>::Sptr(U* u) { 
     //do something 
    } 

    template <typename T> 
    Sptr<T>::Sptr(const Sptr<T> &copyObj) { 
     //do copy constructor stuff 
    } 

    template <typename T> 
    template <typename U> 
    Sptr<T>& Sptr<T>::operator=(const Sptr<U> &t) { 
     return *this; 
    } 

    template <typename T> 
    void Sptr<T>::reset() { 
     //do something 
    } 

    template <typename T1, typename T2> 
    bool operator==(const Sptr<T1> &, const Sptr<T2> &) { 
     //do something 
     return true; 
    } 

    template <typename T, typename U> 
    Sptr<T> static_pointer_cast(const Sptr<U> &sp) { 
     //do something 
     return true; 
    } 

    template <typename T, typename U> 
    Sptr<T> dynamic_pointer_cast(const Sptr<U> &sp) { 
     //Do something 
     return true; 
    } 
} 


using namespace std; 
using namespace my; 
/* Basic Tests 1 ================================================================================ */ 

class Base1 { 
    protected: 
     Base1() : derived_destructor_called(false) { 
      printf("Base1::Base1()\n"); 
     } 
    private: 
     Base1(const Base1 &); // Disallow. 
     Base1 &operator=(const Base1 &); // Disallow. 
    protected: 
     ~Base1() { 
      printf("Base1::~Base1()\n"); 
      assert(derived_destructor_called); 
     } 
    protected: 
     bool derived_destructor_called; 
}; 

class Derived : public Base1 { 
     friend void basic_tests_1(); 
    private: 
     Derived() {} 
     Derived(const Derived &); // Disallow. 
     Derived &operator=(const Derived &); // Disallow. 
    public: 
     ~Derived() { 
      printf("Derived::~Derived()\n"); 
      derived_destructor_called = true; 
     } 
     int value; 
}; 

void basic_tests_1() { 

} 

int main(int argc, char *argv[]) { 

    cout << "Hello world"; 
    basic_tests_1(); 

    return 0; 
} 

Когда я компилирую компилируется без проблем, но файл ./a.out не производится. Поэтому я использовал команду -o, но это тоже не удалось. Вот мой консольный выход

$:~/oops$ g++ Sptr.hpp 
$:~/oops$ ./a.out 
bash: ./a.out: No such file or directory 
$:~/oops$ g++ Sptr.hpp -o sp 
$:~/oops$ ./sp 
bash: ./sp: Permission denied 
$:~/oops$ sudo ./sp 
sudo: ./sp: command not found 
$:~/oops$ ls 
1 sp Sptr.cpp Sptr.hpp 
$:~/oops$ ls -la sp 
-rw-rw-r-- 1 adarshakb adarshakb 10763696 Mar 29 19:33 sp 
$:~/oops$ chmod 0777 ./sp 
$:~/oops$ ls -la sp 
-rwxrwxrwx 1 adarshakb adarshakb 10763696 Mar 29 19:33 sp 
$:~/oops$ ./sp 
bash: ./sp: cannot execute binary file 

В чем проблема, что двоичный файл не создается? Моя версия g ++ - 4.7, и я запускаю Ubuntu 12.10.

PS: простой привет мир программа работает


Если я переименовать файл из .hpp в .cpp компилирует правильно.

Примечание: Все коды указаны в отдельном файле. Другой файл просто пуст.

Почему это?

EDIT:

@teppic упоминает, что

Он будет генерировать прекомпилированный заголовок, а не исполняемый файл

+2

Вы компиляции '.hpp' файл, который включает в себя' .cpp' файл. Разве это не должно быть наоборот? – mfontanini

+0

@mfontanini hmm может быть истинно логически, я не заметил имен. Но я уверен, что собираю правильное содержание. Cos Если я просто прокомментирую все остальное, кроме мира привет, он печатает его. – footy

+1

Выполнить 'файл fp'. – mfontanini

ответ

4

От ССАГПЗ руководства:

file.hh 
    file.H 
    file.hp 
    file.hxx 
    file.hpp 
    file.HPP 
    file.h++ 
    file.tcc 
    C++ header file to be turned into a precompiled header or Ada spec. 

т.е. расширение неправильно.

Если проверить тип файла, он подтвердил:

$ g++ -o foo foo.hpp 
$ file foo 
foo: GCC precompiled header (version 013) for C++ 
Смежные вопросы