Повторяющийся вопрос this.
У меня есть такой класс:
template <class T>
class foo {
public:
foo(){}
template <int S>
void bar (){}
}
Если этот класс вызывается с помощью:
int main(){
foo<float> m;
m.bar<1>();
}
Выдает ошибку:
ошибка: ожидаемое первичное выражение перед токеном ')'
снова устарел:
Мой код:
#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>();
Я получаю сообщение об ошибке:
Связанная функция-член может вызываться только
Однако, если я оберну функцию бара во что-то вроде void bar1 () {return bar ‹1> ();}, это сработает. Я знаю, что если T не известен во время компиляции, он не будет компилироваться. Но я не знаю, почему компилятор не настолько умен, чтобы понять, что 1 в f.bar ‹1> статична?
Благодарность!