Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Renji
2124 / 1562 / 476
Регистрация: 05.06.2014
Сообщений: 4,542
1

Const int& ссылки и константы в шаблонах

02.05.2017, 18:55. Просмотров 845. Ответов 8
Метки нет (Все метки)

Есть шаблон. В шаблоне есть константа int. Константу надо передать в STL функцию, принимающую const int& в качестве аргумента. Однако же, gcc ругается что "undefined reference". Причем, что странно - push_back вектора ругается, а конструктор pair не ругается. Если объявить собственную функцию принимающую const int&, в нее константа опять же не передается. Вопрос: так как объявить константу так, чтобы она передавалась куда надо? Пока нашел следующие варианты решения проблемы:
1) Передавать int(myConst) - работает, но костыль.
2) Объявить константу вне шаблона. Работает, но что делать если константа зависит от аргументов шаблона?
3) Написать где ни будь const int MyTemplate<int>::myConst=0;. Что, для каждого возможного набора аргументов шаблона писать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<typename T>
struct Test
{
    static constexpr int x=std::numeric_limits<T>::max();
    void firstMethod(const int&){}
    void secondMethod()
    {
        firstMethod(0);//так работает
        firstMethod(int(x));//и так работает
        firstMethod(x);//а вот так - не работает
        std::pair<int,int> pair(x,x);//вот так работает
        std::vector<int> vector;
        vector.push_back(x);//а вот так опять не работает
    }
};
 
int main()
{
    Test<int> test;
    test.secondMethod();
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2017, 18:55
Ответы с готовыми решениями:

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const ...

error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'
Что означает ошибка в 8 строчке error: invalid operands of types 'const int*'...

int const и const int в чем разница этих записей
Попалась мне тут программа для выборочно сортировки, с ней все в принципе ясно,...

Чем отличаются выражения (const int[]){value} от (const int[]){100}
(const int){22} //Приведение к массиву и инициализация его значениями 22 от...

Напишите функцию f(int& m1, int& m0, int N), которая воз- вращает первую и последнюю цифры двузначного натурального числа N
Напишите функцию f(int&amp; m1, int&amp; m0, int N), которая воз- вращает первую и...

8
hoggy
Заблокирован
Эксперт С++
02.05.2017, 19:04 2
инклюдов не хватало.

http://rextester.com/IHWZ40028
0
DrOffset
9014 / 4861 / 1196
Регистрация: 30.01.2014
Сообщений: 7,943
02.05.2017, 19:10 3
Цитата Сообщение от Renji Посмотреть сообщение
Написать где ни будь const int MyTemplate<int>::myConst=0;
Зачем? Можно написать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T>
struct Test
{
    static constexpr int x = std::numeric_limits<T>::max();
 
    void firstMethod(const int&){}
    void secondMethod()
    {
        firstMethod(0);//так работает
        firstMethod(int(x));//и так работает
        firstMethod(x);//а вот так - не работает
        std::pair<int,int> pair(x,x);//вот так работает
        std::vector<int> vector;
        vector.push_back(x);//а вот так опять не работает
    }
};
 
template<typename T>
constexpr int Test<T>::x;
1
Renji
2124 / 1562 / 476
Регистрация: 05.06.2014
Сообщений: 4,542
02.05.2017, 19:12  [ТС] 4
Цитата Сообщение от hoggy Посмотреть сообщение
инклюдов не хватало.
Да нет, инклуды разумеется были на месте. И вроде бы тестил в свеженьком gcc 6.3.0. На этом rextester.com версия и ключи компиляции нигде не подписаны?

Добавлено через 50 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем? Можно написать так:
Спасибо, вероятно наиболее приемлемый вариант, если не удастся понять почему на rextester все работает, а у меня - нет.
0
DrOffset
9014 / 4861 / 1196
Регистрация: 30.01.2014
Сообщений: 7,943
02.05.2017, 19:20 5
Лучший ответ Сообщение было отмечено Renji как решение

Решение

Цитата Сообщение от Renji Посмотреть сообщение
почему на rextester все работает, а у меня - нет.
В общем случае в первоначальном виде и не должно работать. Т.к. при передаче в функцию возможно потребуется адресовать x, что приведет к требованию размещения его в памяти. А если нет определения, то как раз и будет указанная ошибка. Cтандартный класс std::integral_constant<T>, к слову, это учитывает именно поэтому:
C++
1
2
3
4
5
6
7
8
9
10
11
12
   /// integral_constant
   template<typename _Tp, _Tp __v>
   struct integral_constant
   {
      static constexpr _Tp                  value = __v;
      typedef _Tp                           value_type;
      typedef integral_constant<_Tp, __v>   type;
      constexpr operator value_type() { return value; }
   };
   
   template<typename _Tp, _Tp __v>
   constexpr _Tp integral_constant<_Tp, __v>::value;
https://gcc.gnu.org/onlinedocs/gcc-4...90_source.html
1
Renji
2124 / 1562 / 476
Регистрация: 05.06.2014
Сообщений: 4,542
02.05.2017, 19:23  [ТС] 6
Цитата Сообщение от DrOffset Посмотреть сообщение
В общем случае в первоначальном виде и не должно работать. Т.к. при передаче в функцию возможно потребуется адресовать x, что приведет к требованию размещения его в памяти.
Ну так как с числовыми литералами - неявно создать временный объект и передать ссылку на него. Я полагал что в том смысл constexpr констант и состоит.
0
DrOffset
9014 / 4861 / 1196
Регистрация: 30.01.2014
Сообщений: 7,943
02.05.2017, 19:33 7
Цитата Сообщение от Renji Посмотреть сообщение
Я полагал что в том смысл constexpr констант и состоит.
Тут как и с constexpr-функциями, стоит constexpr попасть в не-constexpr контекст, как вся его "constexpr-овость" улетучивается
0
hoggy
Заблокирован
Эксперт С++
02.05.2017, 19:49 8
Цитата Сообщение от Renji Посмотреть сообщение
версия и ключи компиляции нигде не подписаны?
подписаны
0
Kudryashov_R_D
20 / 20 / 10
Регистрация: 11.09.2015
Сообщений: 101
02.05.2017, 21:04 9
Renji, Микрософт Вижуал Студио 2015 компилирует и "исполняет"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// cl /EHsc /W4 TestConstTemplate.cpp
#include <limits>
#include <utility>
#include <vector>
 
template<typename T>
struct Test
{
  static constexpr int x=std::numeric_limits<T>::max();
  void firstMethod(const int&){}
  void secondMethod()
  {
    firstMethod(0);//так работает
    firstMethod(int(x));//и так работает
    firstMethod(x);//а вот так - не работает
    std::pair<int,int> pair(x,x);//вот так работает
    std::vector<int> vector;
    vector.push_back(x);//а вот так опять не работает
  }
};
 
int main()
{
  Test<int> test;
  test.secondMethod();
}
0
02.05.2017, 21:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2017, 21:04

C2280 "bulb &bulb::operator =(const bulb &)": предпринята попытка ссылки на удаленную функцию
Есть некий класс моей реализации под названием bulb, когда я пытаюсь сделать...

Изменение конструкции "vector<int> name(const vector<int>& v)"
Здравствуйте, можете подсказать каким образом можно изменить конструкцию...

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru