Одна ошибка:
std::string values::address = "192.0.0.1";
является правильной формой, в противном случае парсинг
std::string::values::address = "192.0.0.1";
и нет члена "values" с членом "address" внутри "string" ...
это будет работать для встроенных типов, так как они никогда не могут содержать членов .. поэтому int :: values - это однозначный синтаксический анализ, int :: values, потому что предыдущий не имеет смысла.
std::string (::values::address) = "192.0.0.1";
тоже работает. Обратите внимание, что если вы введете typedef int sometype; что у вас возникнет та же проблема с использованием sometype, что и с приведенной выше строкой, но не с "int".