2015-03-08 6 views
-3
template<typename T>  
void func(T* arr, size_t length) 
{ 
    size_t size_half = length/2; 
    T* left = arr, right = arr + size_half; // Cannot initialize a variable of type 'int' with an rvalue of type 'int *' 
} 

Il me semble que le compilateur pense que right est de type int au lieu de int *, pourquoi?Pourquoi cette syntaxe d'initialisation illégale?

Répondre

4

Parce que le * est attaché au droit, et non la gauche.

Regardez plus comme:

T *left, right 

C'est juste comment la syntaxe du langage est définie. Vous pouvez le fixer par:

T *left=...,*right=....; 
+0

Eh bien, cela devient aussi dans l'ensemble où placer l'argument de la syntaxe du pointeur :) La façon dont je pensais à ce sujet était int * comme son propre type , tout comme le double * et le double sont des types, j'ai toujours placé le * sur la gauche. J'ai été influencé pour commencer à placer le pointeur vers la droite maintenant, pour des situations comme celle-ci. –

+1

@FranciscoAguilera La vraie solution consiste à s'en tenir à une seule déclaration par ligne. Mettre le pointeur sur la droite a aussi l'air ridicule. Malheureusement, cette syntaxe merdique est héritée de C. – juanchopanza

+0

Une solution courante qui évite l'ambiguïté est de faire quelque chose comme: 'typedef T * pointer; 'et ensuite' pointer left = ..., right = ...; ' – Photon

0

Ce sera comme cette

T *left = arr, *right = arr + size_half; 
2

Dans les types, les * appliquent à ce qui suit, vous devez donc le code:

template<typename T> void func(T* arr, size_t length) { 
    size_t size_half = length/2; 
    T *left = arr, 
    *right = arr + size_half; 
    //etc... 
} 

En fait, je pense que vous devez déclarer un pointeur par ligne:

T *left= arr; 
    T *right= arr + size_half; 

ou même (style C++ 11):

T *left {arr}; 
    T *right {arr + size_half}; 

ou

auto left {arr}; 
    auto right {arr + size_half}; 

déclarant chaque pointeur sur sa ligne est à mon humble avis beaucoup plus lisible.

BTW, vous pouvez envisager d'utiliser std::array<T> ou std::vector<T>

+0

Ouais, merci, malheureusement la personne qui m'a demandé d'écrire ceci est en arrière comme diable et veut que j'utilise des tableaux de style c:/ –

+0

eh bien, tout le point dans mon esprit de l'initialisation délimitée par des virgules était de faire des one-liners. À moins qu'il y ait un autre but derrière eux, je les utiliserais pour faire un paquebot, et votre deuxième exemple pour 2 paquebots. –

+0

Je crois qu'une définition de pointeur d'une ligne devrait être très courte et lisible, donc je ne vais pas coder comme vous voulez. –