- Forum
- Beginners
- error: default argument for template par
error: default argument for template parameter for class enclosing
I am trying to implement a std::list-like doubly linked list and when defining a constructor I am coming across an error that I don’t quite understand.
The stripped down code:
|
|
When trying to compile an error is thrown:
error: default argument for template parameter for class enclosing 'List<T>::List(InputIt, InputIt)'|
The error message is not clear for me, anyone to shine a light?
Thanks!!
Last edited on
template<typename T>
template<typename InputIt, typename = std::_RequireInputIter<InputIt>>
List<T>::List(I….
Why do you have two template things stacked on top of each other?
@highwayman
template<typename T>
is for List<T>
template<typename InputI...
is for List(InputIt first, InputIt last)
Ahhh wait I get it now ok cool.
Default arguments only belong in the declaration:
|
|
Last edited on
@mbozzi oh I see, Thanks
Is there any workaround for that?
Last edited on
Yes, if it wasn’t clear from the above, here’s a version that compiles:
|
|
Topic archived. No new replies allowed.
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
1 |
|
04.11.2017, 00:22. Показов 1665. Ответов 36
ISO 14882:2003 14.5.4.3/2 If a member template of a class template is partially specialized, the member template partial specializations Не понял каким образом при инстанцировании шаблона класса автоматически инстанцируется шаблонный метод этого класса, и про неявную специализацию очень мутно написано. Добавлено через 22 минуты Добавлено через 2 часа 27 минут Expressions of the following forms are never type-dependent (because the type of the expression cannot be sizeof выражение срабатывает спокойно от параметра шаблона.
__________________
0 |
119 / 9 / 2 Регистрация: 06.09.2017 Сообщений: 82 |
|
04.11.2017, 01:01 |
2 |
sizeof выражение срабатывает спокойно от параметра шаблона. Тип sizeof(…) всегда size_t, он не зависит от типа того, что в скобках. Поэтому и не type-dependent.
1 |
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
05.11.2017, 23:03 [ТС] |
3 |
animefan, Это итак понятно. Но там многозначность трактовки. Толи они рассматривают данный случай как исключение и тогда то что вы говорите, либо как уточнение предыдущего правила и тогда sizeof(…) при зависимом типе впринцепе должен быть illformed. Щас вот читаю про точку инстанцирования. Столько разнообразных случаев и ни одного примера. For a function template specialization, a member function template specialization, or a specialization for a
0 |
119 / 9 / 2 Регистрация: 06.09.2017 Сообщений: 82 |
|
06.11.2017, 00:06 |
4 |
Но там многозначность трактовки. Там однозначность трактовки.
как уточнение предыдущего правила Какое ещё уточнение? Предыдущее правило говорит об id-expression, а также о нескольких других видах выражений, к которым sizeof не относится.
sizeof(…) при зависимом типе впринцепе должен быть illformed. «Expressions of the following forms are never type-dependent» это констатация факта, а не правило, чтобы его можно было нарушить.
0 |
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
06.11.2017, 00:12 [ТС] |
5 |
animefan, «Expressions of the following forms are never type-dependent» Означает только чем оно не является, как исключение из ранее определённого правила:
0 |
119 / 9 / 2 Регистрация: 06.09.2017 Сообщений: 82 |
|
06.11.2017, 00:25 |
6 |
как исключение из ранее определённого правила: Давно sizeof(…) стало id-expression?
0 |
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
06.11.2017, 00:34 [ТС] |
7 |
animefan,
0 |
119 / 9 / 2 Регистрация: 06.09.2017 Сообщений: 82 |
|
06.11.2017, 00:38 |
8 |
Pechkin80, и что тебе непонятно в «Except as described below»? Не знаешь, как «except» переводится?
0 |
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
06.11.2017, 00:40 [ТС] |
9 |
animefan, Мне всё понятно. Я лишь утверждаю то о чём писал выше. И если честно мне уже неактуально. С точкой инстанцирования гораздо всё запутанней.
0 |
119 / 9 / 2 Регистрация: 06.09.2017 Сообщений: 82 |
|
06.11.2017, 00:41 |
10 |
Мне всё понятно. Тогда к чему было
там многозначность трактовки. Толи они рассматривают данный случай как исключение, либо как уточнение ?
0 |
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
06.11.2017, 01:15 [ТС] |
11 |
animefan, Спасибо, разобрался. Осталось разобрать каждый случай с точкой инстанцирования. Щас вот читаю про точку инстанцирования. Столько разнообразных случаев и ни одного примера. For a function template specialization, a member function template specialization, or a specialization for a Добавлено через 28 минут For a function template specialization, a member function template specialization, or a specialization for a Про первую часть всё понятно, хотя лихо завинчено. 2 If a function template or member function of a class template is called in a way which uses the definition of Здесь вроде всё понятно. 3 For a class template specialization, a class member template specialization, or a specialization for a class Это как я понял случай 1, с той лишь разницов что шаблон-субъект, использующий специализированный шаблон-объект не инстанцирован.
0 |
Pechkin80 21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
||||
12.11.2017, 14:56 [ТС] |
12 |
|||
Может кто нибудь пояснит, частичная специализация шаблонов функций запрещена потому что нигде не описана ? Добавлено через 21 час 52 минуты
0 |
495 / 209 / 70 Регистрация: 27.05.2016 Сообщений: 557 |
|
12.11.2017, 15:41 |
13 |
У
0 |
Pechkin80 21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
||||
12.11.2017, 15:49 [ТС] |
14 |
|||
notAll, Я может не понял ваш ответ, но вот пример с опрелением:
Только это ничего не изменило.
0 |
notAll 495 / 209 / 70 Регистрация: 27.05.2016 Сообщений: 557 |
||||
12.11.2017, 15:54 |
15 |
|||
0 |
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
12.11.2017, 16:19 [ТС] |
16 |
notAll, Копи-паст того что вы написали выдал: C:MySoftwarestudy_cpptest14friendsmain.cpp:31 :51: error: default argument for template parameter for class enclosing ‘void TFriendClass::friend_member3(U<T>&)’ Добавлено через 7 минут Добавлено через 3 минуты
1 |
495 / 209 / 70 Регистрация: 27.05.2016 Сообщений: 557 |
|
12.11.2017, 16:25 |
17 |
1 |
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
12.11.2017, 16:31 [ТС] |
18 |
notAll, Я дико извиняюсь, но под форточки самое лучшее это mingw-w64 4.8.3. Лучшего просто нет ещё. Не сделали. Для полноценной поддержки с++11 хватает. Добавлено через 1 минуту
0 |
119 / 9 / 2 Регистрация: 06.09.2017 Сообщений: 82 |
|
12.11.2017, 16:40 |
19 |
Pechkin80, в 4.8.3 нет полноценной поддержки C++11.
0 |
21 / 19 / 7 Регистрация: 14.03.2014 Сообщений: 249 |
|
12.11.2017, 16:46 [ТС] |
20 |
animefan, Судя по данному примеру, у них и с полноценной поддержкой С++03 не всё благополучно. Я читал в интернете что есть, но возможно вы знаете больше. Будут интересны ваши доводы.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
12.11.2017, 16:46 |
Помогаю со студенческими работами здесь
пояснение к коду var f1, f2 : text; Пояснение кода using System; Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |
Может кто-нибудь просветить меня, что не так с этим кодом:
template<typename B=int> // <<<< =int is provoking the error
struct Foo
{
std::array<B,10> data;
template<typename F>
void iterate(F f) const
{
for(unsigned i=0; i<10; i++) {
f(i, data[i]);
}
}
friend std::ostream& operator<<(std::ostream& os, const Foo<B>& a) // Line 17
{
a.iterate([&os](unsigned i, const B& x) {
os << i << "=" << x << "n";
});
return os;
}
};
Сообщение об ошибке с GCC 4.8.1 и --std=c++11
:
test.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Foo<B>&)’:
test.cpp:17:41: error: default argument for template parameter for class enclosing ‘operator<<(std::ostream&, const Foo<B>&)::__lambda0’
a.iterate([&os](unsigned i, const B& x) {
4
Решение
a.iterate([&os](unsigned i, const B& x) {
os << i << "=" << x << "n";
});
Введенная здесь лямбда-функция имеет эффект объявления «неназванного» локального класса в области видимости функции в пределах operator<<
функция тела. Мы можем написать наш собственный объект функтор, чтобы получить аналогичный эффект:
struct lambda {
std::ostream& os;
lambda(std::ostream& os_) : os(os_) {}
void operator()(unsigned i, const B& x) {
os << i << "=" << x << "n";
}
};
a.iterate(lambda(os));
Это вызывает аналогичную ошибку в g ++:
error: default argument for template parameter for class enclosing
‘operator<<(std::ostream&, const Foo<B>&)::lambda::lambda’
Вот SSCCE:
template <typename T = int>
struct Foo
{
friend void f() {
struct local {};
}
};
И ошибка, которую он вызывает:
error: default argument for template parameter for class enclosing
‘f()::local::local’
Это уже сообщалось как Ошибка GCC 57775.
Как отмечает @PiotrNycz, вы можете обойти, перемещая тело функции operator<<
вне шаблона класса.
1
Другие решения
Bug 53856
— Default argument allowed on member defined outside of class template
Summary:
Default argument allowed on member defined outside of class template
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Note |
Loading
Bug 1149294
— template argument deduction/substitution fails when default argument is lambda
Summary:
template argument deduction/substitution fails when default argument is lambda
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Я пытаюсь избежать концепций в главной ветки моих проектов, поэтому мне нужна альтернатива с type_trait
:
Мне нужен класс, который несколько функций изменится в зависимости от значения bool
.
Кто-то уже предложил мне разделить мой класс, но этот случай здесь не имеет смысла. В каком-то контексте это пул, в котором функция удаления и некоторые другие будут изменены, если тип объекта пула может быть общим или нет.
Поэтому я попытался использовать std::enable_if
, но все еще есть некоторые ошибки (Я хочу, чтобы объявление и реализация были отдельными).
#include <type_traits>
template < typename Object, bool Shared = false >
class Foo {
template < bool S = Shared, typename std::enable_if<S>::type* = nullptr >
void bar();
template < bool S = Shared, typename std::enable_if<!S>::type* = nullptr >
void bar();
};
template < typename Object,
bool Shared >
template < bool S, typename std::enable_if<S>::type* = nullptr >
void Foo<Object, Shared>::bar() {
//do something
}
template < typename Object,
bool Shared >
template < bool S, typename std::enable_if<!S>::type* = nullptr >
void Foo<Object, Shared>::bar() {
//do nothing
}
int main() {
Foo<int> test;
return 0;
}
Test3.cpp:16:33: error: default argument for template parameter for class enclosing ‘void Foo<Object, Shared>::bar()’
void Foo<Object, Shared>::bar() {
^
Test3.cpp:24:33: error: default argument for template parameter for class enclosing ‘void Foo<Object, Shared>::bar()’
void Foo<Object, Shared>::bar() {
EDIT: удалена ошибка копирования/вставки