lundi 11 novembre 2019

Silent name conflict between method name and name of a different class? [duplicate]

This question already has an answer here:

I have a strange problem, I have a Fitness class (Fitness.h+Fitness.cpp) that is used by another class Individual:

Individual.h

#pragma once

#include "Fitness.h"

template <typename GeneType>
class Individual
{
private:
    Fitness fitness;
    GeneType genes;

public:

    Individual(Fitness fitness, GeneType genes);

    Fitness& Fitness();

    GeneType& Genes();

    Individual<GeneType> copy();
};

Individual.cpp

#include "stdafx.h"
#include "Individual.h"


// Ctors

template <typename GeneType>
Individual<GeneType>::Individual(Fitness fitness, GeneType genes) {} // line 8


// Fitness

template<typename GeneType>
Fitness& Individual<GeneType>::Fitness() { return fitness; }


// Genes

template<typename GeneType>
GeneType& Individual<GeneType>::Genes() { return genes; }


// Copy

template<typename GeneType>
Individual<GeneType> Individual<GeneType>::copy() { return Individual<GeneType>(fitness, genes); }

When building the solution I get:

...\individual.cpp(8): error C2988: unrecognizable template declaration/definition
...\individual.cpp(8): error C2059: syntax error: '('
...\individual.cpp(8): error C2143: syntax error: missing ';' before '{'
...\individual.cpp(8): error C2447: '{': missing function header (old-style formal list?)

The errors point to a problem in declaring the ctor but it seems fine. After trying different things I have found out that if I name the fitness accessor something else like GetFitness instead of just Fitness it works fine, which led me to believe there is some kind of conflict.

But I have also read that a popular naming convention (Google?) uses CamelCased names for accessors so my_var uses MyVar() as the accessor but at the same time using the lowercase class name for a member variable is something fairly common, so in turn using an accessor that just so happens to have the same name as the class also looks like it could be a common problem.

Bottom line is: Why does this happen? In my experience with other languages the method names (Fitness()) for a class would be in a whole different namespace than a "neighboring" class (class Fitness) which would be (in absence of an explicit namespace) in the global namespace.

Also, is there a way to make this code play nice without changing the naming convention for accessors?

Aucun commentaire:

Enregistrer un commentaire