Поскольку OP уже подозревал, что это проблема области.
class Card
имеет свою собственную область и предоставляет элемент Card::to_string()
.
Внутри функций-членов все символы сначала пытаются разрешить в области видимости перед разрешением переходит к внешним областям, если это не удалось.
В этом случае разрешение имен не удалось, но был предоставлен кандидат.
К сожалению, разрешение имен прекращается, как только он нашел кандидатов - неправильный в случае OP.
Следовательно, нужна некоторая явная помощь - оператор области действия (::
).
Исправлено Card::to_string()
:
std::string to_string()
{
return ::to_string(m_Suit);
}
Фиксированный образец OP:
#include <iostream>
/******************** enum class Suit ********************/
enum class Suit
{
Clubs, Spades, Hearts, Diamonds
};
std::string to_string(Suit e)
{
return ("calling 'to_string' function with Suit as parameter");
}
/******************** class Card ********************/
class Card
{
private:
Suit m_Suit;
public:
Card() { m_Suit = Suit::Clubs; }
std::string to_string()
{
return ::to_string(m_Suit);
}
};
int main()
{
std::cout << Card().to_string() << '\n';
return (0);
}
Вывод:
calling 'to_string' function with Suit as parameter
Live Demo on coliru
Кстати. Операторы области видимости обычно разрешаются во время компиляции и не влияют на поведение во время выполнения.