Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Renji
2118 / 1477 / 348
Регистрация: 05.06.2014
Сообщений: 4,306
#1

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

02.05.2017, 18:55. Просмотров 216. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Const int& ссылки и константы в шаблонах (C++):

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

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

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

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

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

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

8
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,985
Завершенные тесты: 1
02.05.2017, 19:04 #2
инклюдов не хватало.

http://rextester.com/IHWZ40028
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
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
2118 / 1477 / 348
Регистрация: 05.06.2014
Сообщений: 4,306
02.05.2017, 19:12  [ТС] #4
Цитата Сообщение от hoggy Посмотреть сообщение
инклюдов не хватало.
Да нет, инклуды разумеется были на месте. И вроде бы тестил в свеженьком gcc 6.3.0. На этом rextester.com версия и ключи компиляции нигде не подписаны?

Добавлено через 50 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем? Можно написать так:
Спасибо, вероятно наиболее приемлемый вариант, если не удастся понять почему на rextester все работает, а у меня - нет.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
02.05.2017, 19:20 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
2118 / 1477 / 348
Регистрация: 05.06.2014
Сообщений: 4,306
02.05.2017, 19:23  [ТС] #6
Цитата Сообщение от DrOffset Посмотреть сообщение
В общем случае в первоначальном виде и не должно работать. Т.к. при передаче в функцию возможно потребуется адресовать x, что приведет к требованию размещения его в памяти.
Ну так как с числовыми литералами - неявно создать временный объект и передать ссылку на него. Я полагал что в том смысл constexpr констант и состоит.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
02.05.2017, 19:33 #7
Цитата Сообщение от Renji Посмотреть сообщение
Я полагал что в том смысл constexpr констант и состоит.
Тут как и с constexpr-функциями, стоит constexpr попасть в не-constexpr контекст, как вся его "constexpr-овость" улетучивается
0
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,985
Завершенные тесты: 1
02.05.2017, 19:49 #8
Цитата Сообщение от Renji Посмотреть сообщение
версия и ключи компиляции нигде не подписаны?
подписаны
0
Kudryashov_R_D
20 / 20 / 3
Регистрация: 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
Привет! Вот еще темы с ответами:

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...

Int* const или const int*? - C++
class A { public: A() : x(777) {} int* const GetX() { return &amp;x; }

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

const& и const* в имени функции - C++
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template &lt;typename T&gt; ...


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

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

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