LINUX.ORG.RU

Сообщения mskmsk1985

 

Перегрузка функций в С++?

Форум — Development

Страуструп утверждает что (стр 387): «Если аргументы функции шаблона были определены путем выведения по фактическим аргментам шаблона, к ним нельза применять продвижения, стандартные и определяемые пользователем преобразования.» При этом на стр 388 приведен правомерный пример:

 template<typename T> class B {...}; template<typename T> class D : public B<T> {...};
template<typename T> void f(B<T>*);
void g(B<int>* pb, D<int>* pd) { f(pb); f(pd); }
но в f(pd) применены стандартные преобразования в указатель на базовый класс! Так какие все же преобразования нельзя применять к аргументам функции шаблона, чьи параметры были выведены на основании типов фактических аргументов?

mskmsk1985
()

gcc и копирующий конструктор.

Форум — Development

Имеем код:

 #include <iostream>

class C1
{
        int i;

        public:
        C1(int I) {i = I; std::cout << "C1 int constructor" <<std::endl;}
        C1(const C1& c) {i = c.i; std::cout << "C1 copy construcror" << std::endl;}
        C1& operator=(const C1& c ) {i = c.i; std::cout <<"C1 operator =" << std::endl; return *this;}
        ~C1() {std::cout << "C1 destructor " << i << std::endl; }
};


int main()
{
        C1 c1 = C1(2);
}

который выдает:

% g++ -std=c++98 -pedantic -Wall -Wextra c++test15.cc
% ./a.out
C1 int constructor
C1 destructor 2

Заметьте при инициализации переменной с1 в main вызывается «C1 int constructor» а о копирующем конструкторе не слова. теперь меняем код:

...
      explicit C1(const C1& c) {i = c.i; std::cout << "C1 copy construcror" << std::endl;}
...

В итоге имеем:

% g++ -std=c++98 -pedantic -Wall -Wextra c++test15.cc
c++test15.cc: In function 'int main()':
c++test15.cc:17: error: no matching function for call to 'C1::C1(C1)'
c++test15.cc:8: note: candidates are: C1::C1(int)

Что называется опаньки! Да типа по правилам языка при инициализации вызывается копирующий конструктор, а он закрыт вот и не собралось. Но если я при инициализации хочу в копирующем конструкторе кое что лишнее сделать то «хрен вам молодые люди», нужный конструктор не вызовется! Вот такая прикольная фича в компиляторе...

mskmsk1985
()

Временные переменные в С++

Форум — Development

Страйструп стр 302 утверждается что «Временная переменная уничтожается, когда „её! ссылка или именованный объект выходят из области видимости“ и что „Временная переменная может использоваться в качестве инициализатора константной ссылки или именованного объекта“. Если оба утверждения верны то:

1) следующее должно работать:

 #include <iostream>

void f1(int i) { std::cout << "hello " << i << std::endl;}

class C1
{
        int i;
        void (*F)(int);

        public:
        C1() {i =1; F=f1; std::cout << "C1 init constructor" << std::endl;}
        C1(int I) {i = I; F=f1; std::cout << "C1 int constructor" <<std::endl;}
        C1(const C1& c) {i = c.i; F=f1; std::cout << "C1 copy construcror" << std::endl;}
        C1& operator=(const C1& c ) {i = c.i; std::cout <<"C1 operator =" << std::endl; return *this;}
        ~C1() {F=0; std::cout << "C1 destructor " << i << std::endl; }
        C1 operator+(const C1& c) {; std::cout << "C1 operator+" <<std::endl; return C1(i + c.i);}
        C1& operator+(int ii) {i += ii; return *this;}
        void f() const {F(i);}
};

int main()
{
        C1 c1;
        C1 c2;
        const C1& c3 = (c1 + c2) + 1;
        C1 c4;
        c1.f();
        c2.f();
        c3.f();
        c4.f();
} 

что не правда:

$g++ -std=c++98 -pedantic -Wall -Wextra c++test13.cc
$./a.out
 C1 init constructor
C1 init constructor
C1 operator+
C1 int constructor
C1 destructor 3
C1 init constructor
hello 1
hello 1
Ошибка сегментации(core dumped)

Какого лешего деструктор вызывается так рано?

2) В следующем деструкторы должны вызываться в конце:

 -"-
int main()
{
        C1 c1;
        C1 c2;
        C1 c3 = (c1 + c2) + 1;
        C1 c4;
        c1.f();
        c2.f();
        c3.f();
        c4.f();
}  

что опять не правда:

$g++ -std=c++98 -pedantic -Wall -Wextra c++test13.cc
$./a.out
C1 init constructor
C1 init constructor
C1 operator+
C1 int constructor
C1 copy construcror
C1 destructor 3
C1 init constructor
hello 1
hello 1
hello 3
hello 1
C1 destructor 1
C1 destructor 3
C1 destructor 1
C1 destructor 1

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

ЗЫ: А вот прикола с константной ссылкой я непонял. Может кто объяснит?

mskmsk1985
()

Константы в С++

Форум — Development

Согласно Страуструпу стр 244 константы по умолчанию подразумевают внутреннюю компоновку, тогда это должно работать: c++test9_f1.cc

#include <iostream>
#include "c++test9.h"

void f(const int *p)
{
        std::cout << "f1" << p << std::endl;
} 
c++test9_f2.cc
#include <iostream>
#include "c++test9.h"
void h(const int *p)
{
        std::cout << "f2" << p <<std::endl;
} 
c++test9.h:
const int* x = 0;
c++test9.cc:
#include "c++test9.h"
void f(const int*);
void h(const int*);

int main()
{
        f(x);
        h(x);
}

Компилируем:

$g++ -std=c++98 -pedantic -Wall -Wextra c++test9_f1.cc -o c++test9_f1.o -c
%g++ -std=c++98 -pedantic -Wall -Wextra c++test9_f2.cc -o c++test9_f2.o -c
%g++ -std=c++98 -pedantic -Wall -Wextra c++test9.cc -o c++test9.o -c
сщбираем:
$g++ c++test9.o c++test9_f1.o c++test9_f2.o
c++test9_f1.o(.bss+0x0): multiple definition of `x'
c++test9.o(.bss+0x0): first defined here
c++test9_f2.o(.bss+0x0): multiple definition of `x'
c++test9.o(.bss+0x0): first defined here 
И что такое? Компоновка то внутренняя, или Я чего не догоняю?

mskmsk1985
()

Вывод параметра шаблона класса в С++

Форум — Development

Есть такой шаблон:

template<typename T> class A
{
      T val;
      public:
      A(T v) : val(v) {} 
};

Можно ли создать объект такого класса-шаблона не зная априори тип T, а вывести этот тип в момен вызова конструктора?

mskmsk1985
()

С++0x ??

Форум — Development

Я тут немного пропустил события, когда стандарт-то примут?

mskmsk1985
()

Где давать определение функции?

Форум — Development

Следующий код правомерен:

void f()
{
        int g();
        std::cout << g() << std::endl;
}
а вот где определять эту g?

mskmsk1985
()

где malloc хранит информацию о размере выледенной памяти?

Форум — Development

Собственно сабж, ведь free принимает void* и должен знать скоко памяти освобождать?!

mskmsk1985
()

Массивы в с++

Форум — Development

Как выглядит указатель на массив массивов указателей?

mskmsk1985
()

CMake с чего начать?

Форум — Development

Посоветуйте с чего начать изучение CMake? На офф сайте инфы много, но она как-то не систематизирована. Например так и не въехал как при генерации Makrfile CMake пониемает какой исходник от каких заголовков в проекте зависит, если вообще такие зависимости учитываются...

mskmsk1985
()

Виртуальные функции в С++

Форум — Development

При пере-объявлении/определении виртуальной функции в производном классе нужно указывать квалификатор virtual или нет?

Пример:

class A { virtual void f() {...} };
class B : public A { voif f() {...} };

или все же правильней так:
class B : public A { virtual voif f() {...} };

mskmsk1985
()

SASL

Форум — Admin

Как выбираются ключи при шифровании трафика при помощи SASL и можно ли расшифровать трафик на третьей машине если перехвачена вся сессия от начала уствновления соединения до его разрыва? Надежно ли шифрование при помощи SASL, например, для svn сессий (SASL шифрование в svnserve)?

mskmsk1985
()

Процесс аутентификации

Форум — Admin

Я правильно понимаю что стандартные функции библиотеки "С" типа getpwent и getpwnam и им подобные берут информацию на основе того что нарисовано в файле nsswitch.conf?

А вот программа login используя pam вызывает эти функции из модуля pam_unix и поэтому зависит от nsswitch.conf?

Я это к тому что если я перенастрою pam для login так чтобы тот использовал pam_ldap и не пользовал pam_unix на то что будет нарисовано в классических системных файлах типа nsswitch.conf, passwd и пр login будет глубоко наплевать?

mskmsk1985
()

GSL vs BOOST?

Форум — Development

Нужно проводить много вычислений различных Бесселей. Что лучше с точки зрения скорости и точности?

mskmsk1985
()

Привязать поток выполнения к определенному ядру процессора во FreeBSD

Форум — Development

Есть программные или "административные" методы сделать именно так?

mskmsk1985
()

Сборка GCC (Портирование GNAT под FreeBSD)

Форум — Development

Привожу решение проблемы по портирования gnat из линукса на 64 битную фриБСД. Как уже писал ранее суть трабля в том что под БСД в 63 бита рабочего gnat пока нет прямо там собрать свой неполучиться т. к. для сборки gnat нужен ... gnat!

Итак для портирования выполняются следующие шаги.
1) Выбирается prefix директория куда будет собираться новый промежуточный компилятор, например $HOME/gcc поддиректория bin добавляется в PATH а lib в LD_LIBRARY_PATH
2) собирается нативный для linux компилятор и устанавливается в $HOME/gcc. Пример конфигурации:
../gcc-4_4-branch/configure --prefix=$HOME/gcc --enable-languages=c,ada --enable-checking=release --enable-ssp --enable-__cxa_atexit --enable-libstdcxx-allocator=new --enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586 --with-tune=core2 --build=x86_64-suse-linux
устанавливается ксобраный компилятор, НО РЕЗУЛЬТАТЫ СБОРКИ НЕ ОЧИЩАЮТСЯ!
2) В $HOME/gcc собирается кроссплатформенное окружение в виде binutils (Обязательно собрать с опцией --with-sysroot) и каталогов /lib /usr/lib /usr/include целевой системы
3) Собирается кроссплатформенный компилятор. Пример конфигурации:
../gcc-4_4-branch/configure --prefix=$HOME/gcc --target=x86_64-mybuild-freebsd7 --enable-languages=c,ada --enable-__cxa_atexit --enable-shared --with-sysroot=$HOME/gcc/x86_64-mybuild-freebsd7/ --with-headers=$HOME/gcc/x86_64-mybuild-freebsd7/usr/include --with-libs=$HOME/gcc/x86_64-mybuild-freebsd7/lib --with-arch-32=i586 --with-tune=core2 --enable-libstdcxx-allocator=new
собранныйкомпилятор устанавливается.
4) ПОВЕРХ КРОСС-КОМПИЛЯТОРА ПЕРЕУСТАНАВЛИВАЕМ НАТИВНЫЙ ДЛЯ СИСТЕМЫ КОМПИЛЯТОР выдавая make install в директории его сборки
5) Делаем копию дерева исходных кодов компилятора. На оригинал gcc-4_4-branch накладываем приведенный далее пач: patch -p0 < cross_natice.patch . Это необходимо так как на данный момент система сборки gnat в gcc разломана для кроскомпиляции нативного компилятора.
6) Также необходимо добавить в дерево исходных текстов компилятора файл gcc/ada/system-freebsd-x86_64.ads приведенные ниже
7) Кросскомпиляцией собираем в дирректроию $HOME/gcc/freebsd/ GMP и MPRF.
8) Собираем нативный для целевой системы компилятор. Пример конфигурации:
./gcc-4_4-branch/configure --build=x86_64-suse-linux --host=x86_64-mybuild-freebsd7 --prefix=$HOME/gcc/freebsd/ --enable-languages=c,ada --with-gmp=$HOME/gcc/freebsd/ --with-mpfr=$HOME/gcc/freebsd/ --disable-shared --disable-bootstrap --disable-multilib
9) Устанавливаем компилятор. Запаковываем его переписываем под FreeBSD 7 amd 64 и там уже на его основе собираем еще один gcc который и можно будет использовать.

Вот такой геморойчик!

mskmsk1985
()

Сборка GCC

Форум — Development

Надо собрать gcc для Freebsd из под linux. Первый этап этой эпопеи - сборка кроскомпилятора прошел успешно. Теперь остался второй этап - сборка нитивнного для bsd компилятора при помощи собранного крос-компилятора. Возникают проблемы с тем, что во время сборки нативного gcc у процесса сборки постоянно чешуться руки что-то собрать и начать это использовать, что увы невозможнло так как целевая архитектура отличается от той на которой собирается компилятор (то что собралось для bsd не может запуститься под linux). Инфы по этому процессу наковырять неудалось, может кто поделиться идеей?

mskmsk1985
()

Фишка в GCC

Форум — Development

Есть ли разница в двух таких командах:
g++ -lpthread -o test test.cc
g++ -o test test.cc -lpthread
Какая правильная?

mskmsk1985
()

конструкторы в С++

Форум — Development

Есть такой тод:
class A {
...
public:
A(int param1 = 0) { A(0, param1); }
A(int* param0, int param1 = 0)
...
};
...
A a(2);
Вопрос: при вызове конструктора A(0, param1) в теле другого конструктора будет создан тотже объект (получается некая обуртка к конструктору) или будет создат временный объект?

mskmsk1985
()

Шаблоны в С++

Форум — Development

Есть ли аналог параметров по умолчанию для шаблонов классов, что-то типа (тип шаблона по умолчанию)?

mskmsk1985
()

RSS подписка на новые темы