Коллеги, объясните пожалуйста почему не компилируется и как забороть:
struct A
{
static constexpr int foo() { return 1; }
};
template <class T>
void bar(T&& t)
{
T::foo(); // <-- error
}
int main()
{
const A a;
bar(a);
return 0;
}
1.cpp: In instantiation of ‘void bar(T&&) [with T = const A&]’:
1.cpp:15:10: required from here
1.cpp:9:11: error: ‘foo’ is not a member of ‘const A&’
T::foo();
Здравствуйте, MTD, Вы писали:
MTD>Коллеги, объясните пожалуйста почему не компилируется и как забороть:
MTD>
MTD>1.cpp: In instantiation of ‘void bar(T&&) [with T = const A&]’:
MTD>
T = const A&, т.е. надо избавиться от ссылки и квалификатора const, чтобы получить "голый" тип A. Например, с помощьюstd::decay<T>::type или std::decay_t<T>.
Здравствуйте, Constructor, Вы писали:
C>T = const A&, т.е. надо избавиться от ссылки и квалификатора const, чтобы получить "голый" тип A. Например, с помощьюstd::decay<T>::type или std::decay_t<T>.
Оффтоп: для нормального писания на крестах (нормального — это при котором есть смысл выбирать кресты, а не шарпик) вот всю эту хренатень знать обязательно?
C>>T = const A&, т.е. надо избавиться от ссылки и квалификатора const, чтобы получить "голый" тип A. MTD>Спасибо, непонятно только почему если есть константность, то компилятор статический метод не видит
Он не видит статический метод не потому, что этот тип константный, а потому, что этот тип — ссылка. Вот так тоже будет работать, в этом конкретном случае:
Здравствуйте, MTD, Вы писали:
MTD>Это я вижу, мне непонятно почему если A& то статический метод для компилятора есть, а если ссылка константная, то его нет.
Здравствуйте, T4r4sB, Вы писали:
C>>T = const A&, т.е. надо избавиться от ссылки и квалификатора const, чтобы получить "голый" тип A. Например, с помощьюstd::decay<T>::type или std::decay_t<T>.
TB>Оффтоп: для нормального писания на крестах (нормального — это при котором есть смысл выбирать кресты, а не шарпик) вот всю эту хренатень знать обязательно?
Эта хренотень называется Forwarding References. Не знаю кому как, а мне этой фичи очень не хватало в C++03. Мое мнение — да, обязательно.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, T4r4sB, Вы писали:
TB>Оффтоп: для нормального писания на крестах (нормального — это при котором есть смысл выбирать кресты, а не шарпик) вот всю эту хренатень знать обязательно?
ИМХО: она сама тебя узнает, если прижмет именно что писать нормально на плюсах. Хочешь не хочешь, а придется вкурить.
Здравствуйте, B0FEE664, Вы писали:
BFE>Почему не компилируется коллеги вам уже объяснили.
Нет, мне до сих пор неясно почему такие правила в С++ и чем они аргументированы, неужели по ссылке на тип компилятор не может понять есть ли у типа статический метод.
BFE>А теперь фокус.
Здравствуйте, MTD, Вы писали: MTD>Нет, мне до сих пор неясно почему такие правила в С++ и чем они аргументированы, неужели по ссылке на тип компилятор не может понять есть ли у типа статический метод.
Потому что это уже другой тип.