前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥ROS机器人之现代C++学习笔记2.5 模板

蓝桥ROS机器人之现代C++学习笔记2.5 模板

作者头像
zhangrelay
发布2022-04-29 19:35:17
4960
发布2022-04-29 19:35:17
举报

git clone https://github.com/changkun/modern-cpp-tutorial.git

coliru.stacked-crooked.com


外部模板

代码语言:javascript
复制
#include <iostream>
#include <vector>

template class std::vector<bool>;           // forcely instantiation
extern template class std::vector<double>;  // external template for avoiding instantiation in this file

template<bool T> class MagicType {
    bool magic = T;
};

int main() {
    // the >> in template
    std::vector<std::vector<int>> matrix;
    std::vector<MagicType<(1>2)>> magic; // legal, but not recommended
}

g++ -std=c++17 2.12.external.template.cpp -o exttemp

注意:

尖括号 “>”

代码语言:javascript
复制
std::vector<std::vector<int>> matrix;

不加-std=c++17,按传统c++模式,比如error:

编译器会给出提示的:

2.12.external.template.cpp:17:18: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11

类型别名模板

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <string>

template<typename T, typename U>
class MagicType {
public:
    T dark;
    U magic;
};

// illegal
// template<typename T>
// typedef MagicType<std::vector<T>, std::string> FakeDarkMagic;

typedef int (*process)(void *);
using NewProcess = int(*)(void *);
template<typename T>
using TrueDarkMagic = MagicType<std::vector<T>, std::string>;

int main() {
    // FakeDarkMagic<bool> me;
    TrueDarkMagic<bool> you;
}

g++ -std=c++17 2.13.alias.template.cpp -o altemp

模板求和:

代码语言:javascript
复制
#include <iostream>

template<typename T = int, typename U = int>
auto add(T x, U y) -> decltype(x+y) {
    return x+y;
}

int main() {
    std::cout << add(1, 2) << std::endl;
}

g++ -std=c++17 2.14.default.template.param.cpp -o detemp

变长参数模板

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <string>

// sizeof...
template<typename... Ts>
void magic(Ts... args) {
    std::cout << sizeof...(args) << std::endl;
}


// 1. recursive parameter unpack
template<typename T0>
void printf1(T0 value) {
    std::cout << value << std::endl;
}
template<typename T, typename... Ts>
void printf1(T value, Ts... args) {
    std::cout << value << std::endl;
    printf1(args...);
}

// 2. variadic template parameter unfold
template<typename T0, typename... T>
void printf2(T0 t0, T... t) {
    std::cout << t0 << std::endl;
    if constexpr (sizeof...(t) > 0) printf2(t...);
}

// 3. parameter unpack using initializer_list
template<typename T, typename... Ts>
auto printf3(T value, Ts... args) {
    std::cout << value << std::endl;
    (void) std::initializer_list<T>{([&args] {
        std::cout << args << std::endl;
    }(), value)...};
}

int main() {
    magic();
    magic(1);
    magic(1,"");
    
    printf1(1, 2, "123", 1.1);
    printf2(1, 2.3, "abc");
    printf3(111, 123, "alpha", 1.2);
    return 0;
}

折叠表达式 

代码语言:javascript
复制
#include <iostream>
template<typename ... T>
auto sum(T ... t) {
    return (t + ...);
}
int main() {
    std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
}

非类型模板参数推导

代码语言:javascript
复制
#include <iostream>

template <auto value> void foo() {
    std::cout << value << std::endl;
    return;
}

int main() {
    foo<10>(); // value is deduced as type int
}
代码语言:javascript
复制
shiyanlou:2/ (master) $ g++ -std=c++17 2.12.external.template.cpp -o exttemp
shiyanlou:2/ (master*) $ ./exttemp                                   [14:39:12]
shiyanlou:2/ (master*) $ g++ 2.12.external.template.cpp -o exttemp   [14:39:16]
2.12.external.template.cpp:17:18: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
     bool magic = T;
                  ^
2.12.external.template.cpp: In function \u2018int main()\u2019:
2.12.external.template.cpp:22:32: error: \u2018>>\u2019 should be \u2018> >\u2019 within a nested template argument list
     std::vector<std::vector<int>> matrix;
                                ^
2.12.external.template.cpp:23:35: error: \u2018magic\u2019 was not declared in this scope
     std::vector<MagicType<(1>2)>> magic; // legal, but not recommended
                                   ^
2.12.external.template.cpp:23:35: error: template argument 1 is invalid
2.12.external.template.cpp:23:17: error: template argument 1 is invalid
     std::vector<MagicType<(1>2)>> magic; // legal, but not recommended
                 ^
2.12.external.template.cpp:23:17: error: template argument 2 is invalid
shiyanlou:2/ (master*) $ g++ -std=c++17 2.13.alias.template.cpp -o altemp
shiyanlou:2/ (master*) $ ./altemp                                    [14:46:30]
shiyanlou:2/ (master*) $ g++ -std=c++17 2.14.default.template.param.cpp -o detemp
shiyanlou:2/ (master*) $ ./detemp                                    [14:51:33]
3
shiyanlou:2/ (master*) $ g++ -std=c++17 2.15.variadic.template.param.cpp -o vartemp
2.15.variadic.template.param.cpp: In function \u2018void printf2(T0, T ...)\u2019:
2.15.variadic.template.param.cpp:36:8: error: expected \u2018(\u2019 before \u2018constexpr\u2019
     if constexpr (sizeof...(t) > 0) printf2(t...);
        ^
2.15.variadic.template.param.cpp: In function \u2018auto printf3(T, Ts ...)\u2019:
2.15.variadic.template.param.cpp:43:40: error: parameter packs not expanded with \u2018...\u2019:
     (void) std::initializer_list<T>{([&args] {
                                        ^
2.15.variadic.template.param.cpp:43:40: note:         \u2018args\u2019
2.15.variadic.template.param.cpp:43:44: error: parameter packs not expanded with \u2018...\u2019:
     (void) std::initializer_list<T>{([&args] {
                                            ^
2.15.variadic.template.param.cpp:43:44: note:         \u2018args\u2019
2.15.variadic.template.param.cpp:45:16: error: expansion pattern \u2018(<lambda>(), value)\u2019 contains no argument packs
     }(), value)...};
                ^
2.15.variadic.template.param.cpp: In instantiation of \u2018auto printf3(T, Ts ...) [with T = int; Ts = {int, const char*, double}]\u2019:
2.15.variadic.template.param.cpp:55:35:   required from here
2.15.variadic.template.param.cpp:43:5: error: no matching function for call to \u2018std::initializer_list<int>::initializer_list(<brace-enclosed initializer list>)\u2019
     (void) std::initializer_list<T>{([&args] {
     ^
In file included from /usr/include/c++/5/bits/range_access.h:36:0,
                 from /usr/include/c++/5/string:51,
                 from /usr/include/c++/5/bits/locale_classes.h:40,
                 from /usr/include/c++/5/bits/ios_base.h:41,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from 2.15.variadic.template.param.cpp:10:
/usr/include/c++/5/initializer_list:66:17: note: candidate: constexpr std::initializer_list<_E>::initializer_list() [with _E = int]
       constexpr initializer_list() noexcept
                 ^
/usr/include/c++/5/initializer_list:66:17: note:   candidate expects 0 arguments, 1 provided
/usr/include/c++/5/initializer_list:62:17: note: candidate: constexpr std::initializer_list<_E>::initializer_list(std::initializer_list<_E>::const_iterator, std::initializer_list<_E>::size_type) [with _E = int; std::initializer_list<_E>::const_iterator = const int*; std::initializer_list<_E>::size_type = long unsigned int]
       constexpr initializer_list(const_iterator __a, size_type __l)
                 ^
/usr/include/c++/5/initializer_list:62:17: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/5/initializer_list:47:11: note: candidate: constexpr std::initializer_list<int>::initializer_list(const std::initializer_list<int>&)
     class initializer_list
           ^
/usr/include/c++/5/initializer_list:47:11: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/5/initializer_list:47:11: note: candidate: constexpr std::initializer_list<int>::initializer_list(std::initializer_list<int>&&)
/usr/include/c++/5/initializer_list:47:11: note:   conversion of argument 1 would be ill-formed:
shiyanlou:2/ (master*) $ ./2.15.variadic.template.param.cpp                    [14:56:06]
shiyanlou:2/ (master*) $ g++ -std=c++17 2.15.variadic.template.param.cpp -o vartemp
2.15.variadic.template.param.cpp: In function \u2018void printf2(T0, T ...)\u2019:
2.15.variadic.template.param.cpp:36:8: error: expected \u2018(\u2019 before \u2018constexpr\u2019
     if constexpr (sizeof...(t) > 0) printf2(t...);
        ^
2.15.variadic.template.param.cpp: In function \u2018auto printf3(T, Ts ...)\u2019:
2.15.variadic.template.param.cpp:43:40: error: parameter packs not expanded with \u2018...\u2019:
     (void) std::initializer_list<T>{([&args] {
                                        ^
2.15.variadic.template.param.cpp:43:40: note:         \u2018args\u2019
2.15.variadic.template.param.cpp:43:44: error: parameter packs not expanded with \u2018...\u2019:
     (void) std::initializer_list<T>{([&args] {
                                            ^
2.15.variadic.template.param.cpp:43:44: note:         \u2018args\u2019
2.15.variadic.template.param.cpp:45:16: error: expansion pattern \u2018(<lambda>(), value)\u2019 contains no argument packs
     }(), value)...};
                ^
2.15.variadic.template.param.cpp: In instantiation of \u2018auto printf3(T, Ts ...) [with T = int; Ts = {int, const char*, double}]\u2019:
2.15.variadic.template.param.cpp:55:35:   required from here
2.15.variadic.template.param.cpp:43:5: error: no matching function for call to \u2018std::initializer_list<int>::initializer_list(<brace-enclosed initializer list>)\u2019
     (void) std::initializer_list<T>{([&args] {
     ^
In file included from /usr/include/c++/5/bits/range_access.h:36:0,
                 from /usr/include/c++/5/string:51,
                 from /usr/include/c++/5/bits/locale_classes.h:40,
                 from /usr/include/c++/5/bits/ios_base.h:41,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from 2.15.variadic.template.param.cpp:10:
/usr/include/c++/5/initializer_list:66:17: note: candidate: constexpr std::initializer_list<_E>::initializer_list() [with _E = int]
       constexpr initializer_list() noexcept
                 ^
/usr/include/c++/5/initializer_list:66:17: note:   candidate expects 0 arguments, 1 provided
/usr/include/c++/5/initializer_list:62:17: note: candidate: constexpr std::initializer_list<_E>::initializer_list(std::initializer_list<_E>::const_iterator, std::initializer_list<_E>::size_type) [with _E = int; std::initializer_list<_E>::const_iterator = const int*; std::initializer_list<_E>::size_type = long unsigned int]
       constexpr initializer_list(const_iterator __a, size_type __l)
                 ^
/usr/include/c++/5/initializer_list:62:17: note:   candidate expects 2 arguments, 1 provided
/usr/include/c++/5/initializer_list:47:11: note: candidate: constexpr std::initializer_list<int>::initializer_list(const std::initializer_list<int>&)
     class initializer_list
           ^
/usr/include/c++/5/initializer_list:47:11: note:   conversion of argument 1 would be ill-formed:
/usr/include/c++/5/initializer_list:47:11: note: candidate: constexpr std::initializer_list<int>::initializer_list(std::initializer_list<int>&&)
/usr/include/c++/5/initializer_list:47:11: note:   conversion of argument 1 would be ill-formed:
shiyanlou:2/ (master*) $ g++ -std=c++17 2.16.fold.expression.cpp -o foexp      [14:56:27]
2.16.fold.expression.cpp: In function \u2018auto sum(T ...)\u2019:
2.16.fold.expression.cpp:13:17: error: expected primary-expression before \u2018...\u2019 token
     return (t + ...);
                 ^
2.16.fold.expression.cpp:13:17: error: expected \u2018)\u2019 before \u2018...\u2019 token
2.16.fold.expression.cpp:13:20: error: parameter packs not expanded with \u2018...\u2019:
     return (t + ...);
                    ^
2.16.fold.expression.cpp:13:20: note:         \u2018t\u2019
2.16.fold.expression.cpp: In function \u2018int main()\u2019:
2.16.fold.expression.cpp:16:15: error: no match for \u2018operator<<\u2019 (operand types are \u2018std::ostream {aka std::basic_ostream<char>}\u2019 and \u2018void\u2019)
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
               ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:108:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(__ostream_type& (*__pf)(__ostream_type&))
       ^
/usr/include/c++/5/ostream:108:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&) {aka std::basic_ostream<char>& (*)(std::basic_ostream<char>&)}\u2019
/usr/include/c++/5/ostream:117:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>; std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>]
       operator<<(__ios_type& (*__pf)(__ios_type&))
       ^
/usr/include/c++/5/ostream:117:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018std::basic_ostream<char>::__ios_type& (*)(std::basic_ostream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}\u2019
/usr/include/c++/5/ostream:127:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(ios_base& (*__pf) (ios_base&))
       ^
/usr/include/c++/5/ostream:127:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018std::ios_base& (*)(std::ios_base&)\u2019
/usr/include/c++/5/ostream:166:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(long __n)
       ^
/usr/include/c++/5/ostream:166:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018long int\u2019
/usr/include/c++/5/ostream:170:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(unsigned long __n)
       ^
/usr/include/c++/5/ostream:170:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018long unsigned int\u2019
/usr/include/c++/5/ostream:174:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(bool __n)
       ^
/usr/include/c++/5/ostream:174:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018bool\u2019
In file included from /usr/include/c++/5/ostream:638:0,
                 from /usr/include/c++/5/iostream:39,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/bits/ostream.tcc:91:5: note: candidate: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char; _Traits = std::char_traits<char>]
     basic_ostream<_CharT, _Traits>::
     ^
/usr/include/c++/5/bits/ostream.tcc:91:5: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018short int\u2019
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:181:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(unsigned short __n)
       ^
/usr/include/c++/5/ostream:181:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018short unsigned int\u2019
In file included from /usr/include/c++/5/ostream:638:0,
                 from /usr/include/c++/5/iostream:39,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/bits/ostream.tcc:105:5: note: candidate: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char; _Traits = std::char_traits<char>]
     basic_ostream<_CharT, _Traits>::
     ^
/usr/include/c++/5/bits/ostream.tcc:105:5: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018int\u2019
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:192:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(unsigned int __n)
       ^
/usr/include/c++/5/ostream:192:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018unsigned int\u2019
/usr/include/c++/5/ostream:201:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(long long __n)
       ^
/usr/include/c++/5/ostream:201:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018long long int\u2019
/usr/include/c++/5/ostream:205:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(unsigned long long __n)
       ^
/usr/include/c++/5/ostream:205:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018long long unsigned int\u2019
/usr/include/c++/5/ostream:220:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(double __f)
       ^
/usr/include/c++/5/ostream:220:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018double\u2019
/usr/include/c++/5/ostream:224:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(float __f)
       ^
/usr/include/c++/5/ostream:224:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018float\u2019
/usr/include/c++/5/ostream:232:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(long double __f)
       ^
/usr/include/c++/5/ostream:232:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018long double\u2019
/usr/include/c++/5/ostream:245:7: note: candidate: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
       operator<<(const void* __p)
       ^
/usr/include/c++/5/ostream:245:7: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018const void*\u2019
In file included from /usr/include/c++/5/ostream:638:0,
                 from /usr/include/c++/5/iostream:39,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/bits/ostream.tcc:119:5: note: candidate: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]
     basic_ostream<_CharT, _Traits>::
     ^
/usr/include/c++/5/bits/ostream.tcc:119:5: note:   no known conversion for argument 1 from \u2018void\u2019 to \u2018std::basic_ostream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}\u2019
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:628:5: note: candidate: template<class _CharT, class _Traits, class _Tp> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&)
     operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
     ^
/usr/include/c++/5/ostream:628:5: note:   template argument deduction/substitution failed:
/usr/include/c++/5/ostream: In substitution of \u2018template<class _CharT, class _Traits, class _Tp> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = void]\u2019:
2.16.fold.expression.cpp:16:51:   required from here
/usr/include/c++/5/ostream:628:5: error: forming reference to void
/usr/include/c++/5/ostream:574:5: note: candidate: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*)
     operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
     ^
/usr/include/c++/5/ostream:574:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018const unsigned char*\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:569:5: note: candidate: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*)
     operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
     ^
/usr/include/c++/5/ostream:569:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018const signed char*\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:556:5: note: candidate: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*)
     operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
     ^
/usr/include/c++/5/ostream:556:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018const char*\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/ostream:638:0,
                 from /usr/include/c++/5/iostream:39,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/bits/ostream.tcc:321:5: note: candidate: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*)
     operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
     ^
/usr/include/c++/5/bits/ostream.tcc:321:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018const char*\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:539:5: note: candidate: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*)
     operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
     ^
/usr/include/c++/5/ostream:539:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:51: note:   mismatched types \u2018const _CharT*\u2019 and \u2018void\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                                                   ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:519:5: note: candidate: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char)
     operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
     ^
/usr/include/c++/5/ostream:519:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018unsigned char\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:514:5: note: candidate: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char)
     operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
     ^
/usr/include/c++/5/ostream:514:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018signed char\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:508:5: note: candidate: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char)
     operator<<(basic_ostream<char, _Traits>& __out, char __c)
     ^
/usr/include/c++/5/ostream:508:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018char\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:502:5: note: candidate: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char)
     operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
     ^
/usr/include/c++/5/ostream:502:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018char\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/iostream:39:0,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/ostream:497:5: note: candidate: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT)
     operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
     ^
/usr/include/c++/5/ostream:497:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:51: note:   deduced conflicting types for parameter \u2018_CharT\u2019 (\u2018char\u2019 and \u2018void\u2019)
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                                                   ^
In file included from /usr/include/c++/5/bits/ios_base.h:46:0,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/system_error:209:5: note: candidate: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::error_code&)
     operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __e)
     ^
/usr/include/c++/5/system_error:209:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:21: note:   cannot convert \u2018sum<{int, int, int, int, int, int, int, int, int, int}>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\u2019 (type \u2018void\u2019) to type \u2018const std::error_code&\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                     ^
In file included from /usr/include/c++/5/string:52:0,
                 from /usr/include/c++/5/bits/locale_classes.h:40,
                 from /usr/include/c++/5/bits/ios_base.h:41,
                 from /usr/include/c++/5/ios:42,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from 2.16.fold.expression.cpp:10:
/usr/include/c++/5/bits/basic_string.h:5172:5: note: candidate: template<class _CharT, class _Traits, class _Alloc> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&)
     operator<<(basic_ostream<_CharT, _Traits>& __os,
     ^
/usr/include/c++/5/bits/basic_string.h:5172:5: note:   template argument deduction/substitution failed:
2.16.fold.expression.cpp:16:51: note:   mismatched types \u2018const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>\u2019 and \u2018void\u2019
     std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
                                                   ^
shiyanlou:2/ (master*) $ g++ -std=c++17 2.18.non.type.template.auto.cpp -o notemp
2.18.non.type.template.auto.cpp:12:16: error: \u2018auto\u2019 parameter not permitted in this context
 template <auto value> void foo() {
                ^
2.18.non.type.template.auto.cpp: In function \u2018int main()\u2019:
2.18.non.type.template.auto.cpp:18:13: error: no matching function for call to \u2018foo()\u2019
     foo<10>(); // value is deduced as type int
             ^
2.18.non.type.template.auto.cpp:12:28: note: candidate: template<<typeprefixerror>value> void foo()
 template <auto value> void foo() {
                            ^
2.18.non.type.template.auto.cpp:12:28: note:   template argument deduction/substitution failed:
2.18.non.type.template.auto.cpp:18:13: note: invalid template non-type parameter
     foo<10>(); // value is deduced as type int
             ^
shiyanlou:2/ (master*) $                                                       [15:03:09]
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档