2016-10-12 1 views
0

Comment pourriez-vous dire au compilateur que c'est une déclaration de fonction, par opposition à un membre de données:Comment distinguez-vous la déclaration d'une fonction de membre de classe et les données membre

typedef std::basic_ostringstream<char16_t> foostringstream; 
class TextStream: public foostringstream { 
    public: 
     std::forward_list<TextInstruction> output(); 
}; 

Le problème est que le compilateur (VS2015.3) pour une raison ennuyeuse est sous l'impression que c'est une variable.

+0

Comment avez-vous pensé que VS le considère comme variable? –

+0

Il crache ceci: 'avertissement C4820: 'Text :: TextStream': remplissage de 4 'octets ajouté après le membre de données' Text :: TextStream :: output'' – Warpspace

+1

@Warpspace: Impossible de reproduire dans VS2015 Update 3 sur le extrait ci-dessus. Peut-être qu'il y a quelque chose d'autre en jeu? – AnT

Répondre

0

Le problème est que vous créez une classe vide, ce n'est pas un problème de compilateur. Imaginez que vous avez fait quelque chose comme

class Empty{} 
int main() { 
    Empty a,b; 
    assert (&a == &b); 
    cout << sizeof(Empty) 
} 

qu'est-ce que vous attendez que le résultat soit?

Le compilateur ajoute toujours un remplissage pour s'assurer que & a! = & b, ce qui signifie que sizeof Empty sera> 0 (habituellement 1).

+0

La super-classe ('basic_ostringstream') ne devrait pas être vide, cependant. Plus tard, j'ai ajouté une fonction virtuelle, provoquant la création d'une table de fonctions, et le message d'erreur est le même. – Warpspace

+0

Eh bien, je sais qu'il y a tout un chargement supplémentaire de remplissage ajouté si vous utilisez l'héritage virtuel, mais je ne sais pas encore pourquoi ... Je ne sais pas si c'est encore nécessaire dans la norme, je ne crois pas que les microprocesseurs les mêmes exigences sur leur mémoire. – UKMonkey

+0

Il ya quelque temps, j'ai demandé à propos de la table de fonction virtuelle en ce qui concerne la norme, et on m'a dit que le VFT n'est pas dans la norme du tout, car il est possible qu'un compilateur n'utilise pas. Il se trouve que tous les principaux compilateurs l'utilisent. Il n'y aura donc rien dans la norme sur le rembourrage à faire avec. Je soupçonne que la cause réelle du rembourrage est le VFT, mais si c'est le cas, alors le message d'erreur est extrêmement trompeur – Warpspace