XaeroX
Т.е. функцию вроде-как определили в локальном неймспэйсе класса, а она вылезла в глобальный? Вот этот момент какой-то странный, хоть и компилируется. Это точно не UB?
XaeroX
Так объявление в неймспэйсе класса, а определение в глобальном, вот это мне странно. Так ведь можно и в другом классе такую же функцию объявить и будет путанница или нет?
XaeroX даже если лябмд нет, можно объявлять, например, структуру со статическими методами прямо в теле. Но из двух кошмаров и лямбд, всё же лучше выбирать лямбды.
a1batross писал: даже если лябмд нет, можно объявлять, например, структуру со статическими методами прямо в теле.
Ну можно, конечно, мы в детстве так развлекались.
Но это формально не вложенная функция.
Цитата:
thambs писал: Так ведь можно и в другом классе такую же функцию объявить и будет путанница или нет?
А ты поэкспериментируй с typeid и увидишь, что у них разные сигнатуры будут.
Путаница может быть только с namespace. И здесь у плюсов весьма и весьма запутанные правила. Но они существуют.
А вот ещё вопрос про наследование возник внезапно.
Например, у меня есть базовый шаблонный класс
C++ Source Code:
1
template <typename t, size_t n>
2
struct base{
3
t* data;
4
size_t* shape;
5
base<t, dim>(t* data, size_t* shape):
6
data(data), shape(shape){}
7
...
8
};
внутри которого определены всякие полезные методы.
Я хочу отнаследоваться от него, прилинковав указатель shape к массиву:
C++ Source Code:
1
template <typename t, size_t n>
2
struct derived: base<t, n>{
3
size_t _shape[n];
4
derived<t, dim>(){
5
this->data = nullptr; //кстати, почему здесь нужно обращаться к this?
6
this->shape = _shape;
7
};
8
...
9
};
, однако, хотелось бы избавиться от лишнего присваивания и в явном виде "подменить" указатель на массив. Если я просто объявлю size_t shape[n], то в результате получу ещё одно поле с тем же именем, чего мне не нужно. Как сделать правильно?
Предполагается, что место под данные заранее аллокировано (где угодно, хоть на стеке, хоть в куче, хоть на gpu). Что бы это можно было удобно использовать и копировать, хочется сделать производный класс, который и сам обращается с внешним аллокатором, но вот аллокатить ещё и место под служебные данные совсем не хочется, логично было бы хранить offset и shape прямо в классе. Вот и думаю как лучше сделать.
Дядя Миша
Ну шаблоны - скорее исключение, чем правило. Их обычно не рекомендуют использовать там, где можно без них обойтись (то есть в 99% случаев). Для меня на работе протащить шаблон в master - это всегда праздник.