2016-08-16 3 views
0

Итак, я объявил класс шаблона my_class, и я использую этот класс в другом файле «main.cpp».error: unkown type name "my_class"

Я включил «my_class.h» в свой main.cpp, и я получаю неизвестную ошибку имени типа, кто-нибудь знает, что происходит?

Вот код:

// "my_class.h" 
#ifndef TYPE_H_DEFINE 
#define TYPE_H_DEFINE 

#include <vector> 
#include <algorithm> 

namespace wtvr { 

template<class T> 
class my_class { 
public: 
    void add(const T&); 
    const T& get(); 
private: 
    std::vector<T> my_class_vec; 
}; 

template<class T> 
void my_class<T>::add(const T& obj) { 
    my_class_vec.push_back(obj); 
} 

template<class T> 
const T& my_class<T>::get() { 
    std::random_shuffle(my_class_vec.begin(), my_class_vec.end()); 
    return my_class_vec[0]; 
} 
} 

#endif 
+3

Код, который вы показали, выглядит хорошо для меня. Проблема должна находиться где-то в коде, который вы не показывали. –

+2

Вам необходимо выслать свой код. Как еще вы ожидаете, что мы выясним, что вы делаете неправильно? – Barmar

+0

хорошо сделает –

ответ

1

Это был хитрый!

Оказывается, что мои имена включают защитные

#ifndef TYPE_H_DEFINE 
#define TYPE_H_DEFINE 

уже используется стандартная библиотека языка C++, так что я изменил его на другое имя, не удивительно, почему Бьярне Страуструп ненавидит макросы !! Спасибо всем!

+0

Вы можете избежать этого, используя '#pragma once', хотя это нестандартно, большинство компиляторов поддерживают его. –

+0

@ Torbjörn И это действительно отстой, когда они этого не делают. Составителям разрешено молча отменить любую '# прагму, которую они не поддерживают. – user4581301

+0

@ Torbjörn Я знаю, что могу использовать # прагма один раз, но на практике я хотел бы использовать include guard. –