LINUX.ORG.RU

[C++, boost::ublas] выражения со статическими константами приводят к ошибке компоновщика


0

0

Пацаны, бида!

Информатичка задала домашку на лето. Не могу понять что тут не так:

#include <iostream>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/vector.hpp>

using namespace std;

template <unsigned size>
class My_Class {
public:
typedef boost::numeric::ublas::c_vector<double, size> c_vec;

const static double x = 10.;

static void F(c_vec arg) {
cout << arg*x << endl;
}
};

const unsigned i = 3;

int main() {
typedef boost::numeric::ublas::c_vector<double, i> c_vec;
c_vec v;
My_Class<i>::F(v);

return EXIT_SUCCESS;
}

Выдает ошибку компоновщика:

[Linker error] undefined reference to My_Class<3u>::x

Если же заменить функцию в My_Class на такую:

static void F(c_vec arg) {
cout << x << endl;
}

То все становится хорошо. Как же быть? Могут поставить двойку в журнал.

anonymous

Ответ на: комментарий от Legioner

Лучше так:

/* ... */

template <unsigned size>
class My_Class
{
public:
/* ... */
	static const double x;
/* ... */
};

template <unsigned size>
const double My_Class<size>::x = 10.;

/* ... */

Deleted
()
Ответ на: комментарий от Deleted

Спасибо, ребята. Заработало! Побольше бы таких как вы к нам в школу.

Скажите, а нельзя ли как-то облагородить синтаксис этого решения? А то, когда констант много и шаблонный параметр не один, это смотрится страшненько.

anonymous
()
Ответ на: комментарий от Absurd

>> Плюсы в школе?! Они с ума сошли.

Может хватит высирать бессмысленные сообщения во всех темах, касающихся C++?

Deleted
()
Ответ на: комментарий от Deleted

>> Плюсы в школе?! Они с ума сошли.

>Может хватит высирать бессмысленные сообщения во всех темах, касающихся C++?

Смысл в двух процитированных коротких приложениях есть. Первое - изумление, так как в 15-ти летний мозг плюсы с шаблонами и бустом не влезут, там Паскаль максимум. Второе - констатация невменяемости составителей школьной программы в том случае если они действительно дают плюсы.

Absurd ★★★
()
Ответ на: комментарий от Absurd

Топикстартер просто стебётся, разве не видно? В школе дают эксель и поверпоинт, очень изредка паскаль.

Legioner ★★★★★
()
Ответ на: комментарий от Absurd

>> Первое - изумление, так как в 15-ти летний мозг плюсы с шаблонами и бустом не влезут, там Паскаль максимум.

Откуда дровишки? Во-первых, школа != 15 лет. Во-вторых, я не вижу причин чтобы одиннадцатиклассник не осилилил С++ с шаблонами и boost.

>> Второе - констатация невменяемости составителей школьной программы в том случае если они действительно дают плюсы.

Это зависит от школы. В одном местном физико-математическом лицее в 11-ом классе преподают C в linux. И дополнительные занятия по С++/Assembler/CLisp/Perl/возможночтотоещё для тех кто хочет.

Deleted
()
Ответ на: комментарий от Deleted

Это что, получается размер вектора задаётся параметром шаблона? А если для другого размера надо решить? Программу переписывать?

yz
()
Ответ на: комментарий от yz

>> Это что, получается размер вектора задаётся параметром шаблона? А если для другого размера надо решить? Программу переписывать?

А если нужен вектор не фиксированного размера, то мы используем не c_vector, а vector, размер которого можно менять в рантайме.

http://www.boost.org/doc/libs/1_35_0/libs/numeric/ublas/doc/index.htm

Deleted
()
Ответ на: комментарий от Deleted

>Во-вторых, я не вижу причин чтобы одиннадцатиклассник не осилилил С++ с шаблонами и boost.

Шаблоны С++ может осилить 1% взрослых от силы. Если брать студентов хороших ВТУЗ'ов то все равно намного меньше половины. А чтобы использовать буст шаблоны надо знать на уровне хорошего понимания исходного кода буста иначе первая же простыня ошибок повергнет в ступор.

Absurd ★★★
()
Ответ на: комментарий от Absurd

> Шаблоны С++ может осилить 1% взрослых от силы. Если брать студентов хороших ВТУЗ'ов то все равно намного меньше половины.

О_О Откуда такая статистика? В шаблонах ничего особо страшного нет.

> А чтобы использовать буст шаблоны надо знать на уровне хорошего понимания исходного кода буста иначе первая же простыня ошибок повергнет в ступор.

На любом языке трудно писать без понимания исходного кода...

UnDeFiNeD
()

> в 15-ти летний мозг плюсы с шаблонами и бустом не влезут

По крайней мере шаблоны мне в своё время влезли

UnDeFiNeD
()
Ответ на: комментарий от UnDeFiNeD

> В шаблонах ничего особо страшного нет.

Я, после лет 4 программирования на С++ (1 коммерческого), прочтения александреску, вандервуда и ещё десятка книжек, не могу утверждать, что хорошо знаю шаблоны. На уровне std::vector они просты. На уровне std::numeric_traits уже посложнее. А вот на уровне boost::spirit начинается самое интересное.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Ну и на уровне #ifdef _BORLDAND_CXX начинается уже самое-самое преинтересное :D

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.