Как передать размер массива как шаблон с шаблонным типом?

**index.js**

import React from 'react';
import { render } from 'react-dom';
import App from './components/app';
import { BrowserRouter } from 'react-router-dom'
import { Provider } from 'react-redux';
import store, { history } from './store';

const route = (
  <Provider store={store}>
  <BrowserRouter>
        <App />
  </BrowserRouter>
  </Provider>
)
render(route,document.getElementById('app'))

**action/listItemAction.js**

export const ListItemSuccess = (data) => {
    return {type: 'GET_LIST_ITEMS'};
}

export const getListItems = () => {
    return (dispatch) => {
        return axios.get('http://localhost:5000/api/listitems')
        .then(res => {
           dispatch(ListItemSuccess(res));
        })
        .catch(error=>{
            throw(error);
        })      
    };
}

**reducers/listItems.js**

const listItems = (state = [], action) => {
  switch(action.type){
    case 'GET_LIST_ITEMS':
      return action.res.data;
    default:
      return state;
  }
}

export default listItems;

**store.js**

import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk'
import listItems from './reducers/listItems.js';

const store = createStore(listItems,  compose(
    applyMiddleware(thunk),
    window.devToolsExtension ? window.devToolsExtension() : f => f
  ));

export default store;

**App.js**

import React, { Component } from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import './App.scss';
import getListItems from './action/listItemAction.js

class App extends Component {
  constructor(props) {
    super(props);

    this.state = {
      data: [],
      isLoading: true,
    };

  }
  componentWillMount() {
    this.props.getListItems().then(() => {
      this.setState({data: this.props.listItems, isLoading:false});
    }).catch(error => {
        throw(error);
    });
  }
  render() {
    return (
      <div className="App">
        <h3>Grocery List</h3>
        {this.state.isLoading ? <p>Loading...</p>
          : this.state.error ? <p>Error during fetch!</p>
          : (
              <ul>
                this.state.data.map(item => <li>{item}</li>)
              </ul>
            )}
      </div>
    );
  }
}

const mapStateToProps = (state) => {
    return {
      listItems: state.listItems
    };
};
const mapDispatchToProps = (dispatch) => {
    return {
        getListItems: bindActionCreators(getListItems, dispatch),
    };
};

export default connect(mapStateToProps,mapDispatchToProps)(App);
12
задан Nawaz 17 December 2012 в 12:23
поделиться

1 ответ

Хм, в Стандарте говорится в 14.8.2.4 / 15:

Если в объявлении шаблона функции с шаблонным параметром нетипа шаблонный параметр нетипа будет использоваться в выражении в функциональном списке параметров и, если соответствующий аргумент шаблона будет выведен, то тип аргумента шаблона должен соответствовать типу шаблонного параметра точно, за исключением того, что аргумент шаблона, выведенный из связанного массива, может иметь любой целочисленный тип.

Обеспечение этого примера:

template<int i> class A { /* ... */ };
template<short s> void f(A<s>);
void k1() {
    A<1> a;
    f(a);    // error: deduction fails for conversion from int to short
    f<1>(a); // OK
}

Это предлагает, чтобы компиляторы, которым не удается скомпилировать Ваш код (по-видимому, GCC и Цифровой Марс) сделали это неправильно. Я протестировал код с Comeau, и он компилирует Ваш прекрасный код. Я не думаю, что существует другое от того, зависит ли тип шаблонного параметра нетипа от типа параметра типа или нет. 14.8.2.4/2 говорит, что аргументы шаблона должны быть выведены независимые друг от друга и затем объединились в тип параметра функции. Объединенный с/15, который позволяет типу размера иметь другой целочисленный тип, я думаю, что Ваш код является всем штрафом. Как всегда, я беру c ++-is-complicated-so-i-may-be-wrong карта :)

Обновление: я изучил проход в GCC, где он выкладывает то сообщение об ошибке:

  ...
  type = TREE_TYPE (size);
  /* The array bound must be an integer type.  */
  if (!dependent_type_p (type) && !INTEGRAL_TYPE_P (type))
    {
      if (name)
    error ("size of array %qD has non-integral type %qT", name, type);
      else
    error ("size of array has non-integral type %qT", type);
      size = integer_one_node;
      type = TREE_TYPE (size);
    }
  ...

Это, кажется, отсутствовало для маркировки типа размера как зависимый в более раннем блоке кода. Поскольку тот тип является шаблонным параметром, это - зависимый тип (см. 14.6.2.1).

Обновление: разработчики GCC зафиксировали его: Ошибка № 38950

13
ответ дан 2 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: