2016-06-26 4 views
2

Как изменить подпись distanceTo(..), чтобы сделать компилятором предупреждение или ошибку при вызове с std::size_t в качестве параметра?Как предотвратить size_t от интерпретации как ссылки?

class Point { 
private: 
    float value; 

public: 
    Point(float value) : value(value){}; 
    float distanceTo(const Point &point) { return point.value - value; } 
}; 

int main() { 

    std::size_t index = 1; 
    Point start(1); 
    Point end(4); 
    float dist = start.distanceTo(index); // compiles, but should not! 
    std::cout << dist; 

    return 0; 
} 
+1

Вопрос: «Как предотвратить неявное преобразование типа?» (Вы должны отрегулировать заголовок) –

+0

Да, «Точка» не указатель. – LogicStuff

+0

Пользователи LogicStuff и время публикации cpluplusrat различаются только в секунду. После этого LogicStuff добавил объяснения и ссылки. – VisorZ

ответ

13

Сделать конструктор explicit:

explicit Point(float value) : value(value) {} // no semicolon here 

Это не разрешает неявные преобразования (из size_t через float к Point), но учтите, что это также делает код, такой как start.distanceTo(3.14) и Point p = 3.14; недействительным.

4

Сделать конструктор явным. Измените Point(float value) на explicit Point(float value), и проблема исчезнет.

Смежные вопросы