Почему нельзя ссылаться на пространство имен встраивания в переполнение стека

Я получил три файла в одном проекте

один

namespace sql
{
namespace detail
{
void getColumnValue();
}
}

другой

namespace detail{
.........
}

третий

#include "first_file"namespace sql
{
template<typename TheStruct>
class RowStruct {

public:
void shouldCombine()
{
sql::detail::getColumnValue();
}
}

эти три файла находятся в одних и тех же проектах и ​​в одном внешнем пространстве имен.
но потом я строю, я получил ошибку, чтобы сказать: «sql :: detail ‘не был объявлен
«для третьего файла.

почему я просто не могу сослаться на «детали» в «sql», я что-то пропускаю? Если я использую «detail ::» вместо «sql :: detail ::» в третьем файле, то он пойдет в подробности ::, объявленные во втором файле, что не является тем, что я хочу.

0

Решение

Возможно, «внешнее пространство имен», на которое вы ссылаетесь, является проблемой. Вы должны определить это внешнее пространство имен следующим образом:

// file1
namespace outer {
namespace sql {
namespace detail { ... }
}
}

// file3
#include "file1"
namespace outer {
namespace sql {
namespace detail { ... }
}
}

Если вы положите #include "file1" внутри namespace outer в file3 вы получите проблемы, которые видите.

Также обратите внимание, что если вы внутри namespace sql (где угодно, включая file3), вам не нужно явно говорить sql::detail::, Просто detail:: достаточно изнутри namespace sql чтобы дать тебе sql::detail::, И это независимо от того, namespace detail определения в других пространствах имен (т. е. ваш файл2 не меняет этого).

0

Другие решения

Вы должны включить первый файл (я предполагаю, что это заголовочный файл) в третий файл.

#include "sql_detail.h"
namespace sql
{
template<typename TheStruct>
class RowStruct {

public:
void shouldCombine()
{
sql::detail::getColumnValue();
}
};
}

а во втором файле ты не хотел сказать?

namespace sql{
namespace detail{
//..definitions
}}
0

По вопросам рекламы [email protected]