2012-04-28 2 views
3

Повторяющийся вопрос о this.Функция шаблона члена Int внутри класса шаблона

У меня есть класс, как это:

template <class T> 
class foo { 
public:   

    foo(){} 

    template <int S> 
    void bar(){} 

} 

Если этот класс вызывается с:

int main(){ 
    foo<float> m; 
    m.bar<1>(); 
} 

Это дает ошибку:

error: expected primary-expression before ')' token

устаревшее снова:

Мой код:

#define BOOST_TEST_DYN_LINK 
#define BOOST_TEST_MAIN 

#include <boost/mpl/list.hpp> 
#include <boost/test/unit_test.hpp> 
#include <boost/test/test_case_template.hpp> 
using namespace boost::unit_test; 

#include "foo.hpp" 

BOOST_AUTO_TEST_SUITE(); 

typedef boost::mpl::list<char, int> test_types; 

BOOST_AUTO_TEST_CASE_TEMPLATE(test_Mat_constructor_hwd, T, test_types){ 

    foo<T> m; 
    m.bar<1>(); 
} 

BOOST_AUTO_TEST_SUITE_END() 

Это, однако, не компилируется как BOOST_AUTO_TEST_CASE_TEMPLATE делает что-то странное ...

После текста осуждается:

Однако, когда я вызываю функцию с:

foo f; 
f.bar<1>(); 

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

A bound member function may only be called

Если я, однако, повернул функцию бара в нечто вроде void bar1() {return bar < 1>();}, это сработает. Я знаю, если T не известно во время компиляции, он не будет компилироваться. Но я не знаю, почему компилятор недостаточно умен, чтобы понять, что 1 в f.bar < 1> является статическим?

спасибо!

+0

Я думаю, что вы, возможно, пропустили часть сообщения об ошибке - что не имеет никакого смысла. –

+0

Пожалуйста, уменьшите свою неудачную программу до кратчайшей ** ** программы **, которая все еще не работает. Вы можете обнаружить свое решение в этом процессе. Если нет, сообщите, что ** короткий ** (подсказка: оно должно быть менее 20 строк), ** полная ** (мы должны попытаться скомпилировать ее) в вашем вопросе. Для получения дополнительной информации см. Http: //sscce.org/. –

+0

возможный дубликат [член-функции шаблона C++ класса шаблона, вызванного из функции шаблона] (http://stackoverflow.com/questions/1840253/c-template-member-function-of-template-class-called-from-template- функция) –

ответ

2

Поскольку T аргумент неизвестен при анализе функции тестирования, компилятор не в состоянии определить, что такое выражение m.bar, и поэтому предполагает, что это не шаблонная переменная. m.bar<1>() обрабатывается как (m.bar<1)>(), последний бит является незаконным. Исправление заключается в том, что Явно утверждать bar шаблон:

foo<T> m; 
m.template bar<1>(); 
1

вам нужно сделать функции членов общественности, если вы хотите, чтобы называть их внешне, это прекрасно работает на моем компиляторе

class foo { 
public: 
    foo(){} 

    template <int T> 
    void bar(){} 
}; 

int main(){ 
    foo f; 
    f.bar<1>(); 
} 
+0

о, извините, я забыл опубликовать в этом гораздо более упрощенном примере – guinny

+0

@ Тут, в чем проблема, этот компилятор кода и работает нормально? – 111111

+0

@YCHAI - упрощенный пример * работает *, вот в чем проблема. Покажи нам что-то, чего нет. –

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