2014-11-15 5 views
0

Я делаю некоторые упражнения, чтобы понять шаблон C++. Мое намерение состоит в том, чтобы создать шаблон функции, который изменяет поведение в базе класса шаблона.ошибка с шаблоном функции - не была объявлена ​​

я получаю следующее сообщение об ошибке:

In file included from main.cpp:2:0: 
test1.h: In function ‘int my::fun(char*, int)’: 
test1.h:12:26: error: ‘my::T’ has not been declared 

Упрощенные файлы следующие

------ файл test1.h -------

#ifndef TEST_1_H 
#define TEST_1_H 

#include "test2.h" 

namespace my 
{ 
    template <typename T = myclass> 
    int fun(char* str,int dim) 
    { 
    return my::T::fun(str,dim); 
    } 
} 

#endif 

----- файл test2.h -------

#ifndef TEST_2_H 
#define TEST_2_H 

namespace my 
{ 
    struct myclass 
    { 
    static int fun(char* str,int dim); 
    }; 
} 

#endif 

------ файл test2.cpp --------

#include "test2.h" 

namespace my 
{ 
    int myclass::fun(char* str,int dim) 
    {return 0;} 
} 

----- файл main.cpp -------

#include "test2.h" 
#include "test1.h" 

int main() 
{} 

Может вы, пожалуйста, помогите мне выяснить, где ошибка?

Заранее спасибо.

+0

Для компиляции я использую новый стандарт: г ++ -std = C++ 11 test2.cpp main.cpp – GTA

+0

Просто удалите мой :: before T. Шаблоны аргументов не живут в пространствах имен. –

+0

Hi Coert, все нормально работает. Большое спасибо. Поэтому, когда я использую аргумент шаблона, я никогда не должен квалифицировать аргумент шаблона. – GTA

ответ

0

Имя T является идентификатором аргумента шаблона. Он не живет в каком-либо пространстве имен. Имена аргументов или локальные переменные также не могут быть квалифицированы. Просто удалите my::. Похоже, что это версия кода, использующая my::myclass, которая не была функциональным шаблоном.

С квалификацией вы ссылаетесь имя в области видимости пространства имен:

namespace my { 
    struct T {}; 
    template <typename T> 
    void f() { 
     my::T from_namespace; 
     T  from_template_argument; 
    } 
} 
Смежные вопросы