Функция-член шаблона Int в классе шаблона

Повторяющийся вопрос 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> статична?

Благодарность!


person guinny    schedule 28.04.2012    source источник
comment
Я думаю, вы могли пропустить часть сообщения об ошибке - это не имеет смысла.   -  person Ernest Friedman-Hill    schedule 28.04.2012
comment
Пожалуйста, сократите неудачную программу до самой короткой, полной программы, которая по-прежнему терпит неудачу. Вы можете найти свое решение в процессе. Если нет, опубликуйте эту короткую (подсказку: она должна быть менее 20 строк), полную (мы сможем попытаться скомпилировать ее) программу в своем вопросе. Для дополнительную информацию см. на странице sscce.org.   -  person Robᵩ    schedule 28.04.2012
comment
возможный дубликат функции-члена шаблона C ++ класса шаблона вызывается из функции шаблона   -  person Luc Touraille    schedule 30.04.2012


Ответы (2)


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

foo<T> m;
m.template bar<1>();
person devnev    schedule 28.04.2012

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

class foo {
public:
    foo(){}

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

int main(){
    foo f;
    f.bar<1>();
}
person 111111    schedule 28.04.2012
comment
о, извините, я забыл опубликовать в этом гораздо более упрощенном примере - person guinny; 28.04.2012
comment
@YCHAI - упрощенный пример работает, вот в чем проблема. Покажите нам то, чего нет. - person Ernest Friedman-Hill; 28.04.2012