小编Kla*_*aus的帖子

experimental :: filesystem链接器错误

我尝试在gcc 6.0中使用新的c ++ 1z功能实际开发.

如果我尝试这个小例子:

#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
    fs::path p1 = "/home/pete/checkit";

    std::cout << "p1 = " << p1 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我有:

/opt/linux-gnu_6-20151011/bin/g++ --std=c++1z main.cpp -O2 -g -o go
/tmp/ccaGzqFO.o: In function \`std::experimental::filesystem::v1::__cxx11::path::path(char const (&) [36])':
/opt/linux-gnu_6-20151011/include/c++/6.0.0/experimental/bits/fs_path.h:167: undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status

gcc版本是快照linux-gnu_6-20151011

任何提示如何链接新的c ++ 1z功能?

c++ gcc c++17

72
推荐指数
4
解决办法
4万
查看次数

std :: any没有RTTI,它是如何工作的?

如果我想使用std::any我可以使用RTTI关闭.以下示例-fno-rtti使用gcc 编译并按预期运行.

int main()
{   
    std::any x;
    x=9.9;
    std::cout << std::any_cast<double>(x) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是如何std::any存储类型信息?正如我所看到的,如果我std::any_cast使用"错误"类型调用,我会得到std::bad_any_cast预期的异常.

这是如何实现的,或者这可能只是一个gcc功能?

我发现boost::any也不需要RTTI,但我发现也没有解决这个问题.boost :: any需要RTTI吗?.

深入研究STL标题本身并没有给我答案.那段代码对我来说几乎是不可读的.

c++ stl rtti c++17

24
推荐指数
2
解决办法
4104
查看次数

variadic模板参数包扩展函数调用

我正在寻找类似的东西:

template< typename T>  
void func(T t)
{
}

template< typename... Parms> 
void anyFunc( Parms... p)
{
    func<Parms>(p)... ;  //error 
    func(p)... ;         //error 
}
Run Code Online (Sandbox Code Playgroud)

如果参数包扩展在另一个函数调用内完成,它可以工作:

template< typename T>
int some(T t)
{}

template< typename... Parms>
void func(Parms ...p)
{}

template< typename... Parms>
void somemore(Parms... p)
{
   func( some(p)...);
}

int main() 
{
 somemore(1,2,3,4,10,8,7, "Hallo");
}
Run Code Online (Sandbox Code Playgroud)

参数包扩展也适用于基类初始值设定项列表.

是否有任何解决方案也适用于将返回'void'的函数.上面的解决方法不会,虽然使用函数调用返回参数列表中的void可能永远不会工作.

有任何想法吗?

variadic-templates c++11

17
推荐指数
2
解决办法
5641
查看次数

vim和c ++ 11 lambda:自动缩进

使用vim和c ++ 11 lambda函数实际上很差.缩进不起作用,许多括号被标记为错误.

据我所知,c和c ++的缩进和语法高亮是在内部编程而不是通过ac [...].vim文件.有没有机会为c ++ 11设置vim,特别是对于具有lambda函数的源代码?也许有人可以提示在内部vim语法检查中如何以及在何处添加lambda解析?

编辑:(评论请求的示例代码)

代码应如下所示,但格式化为单个列.

  MyLoop( [](int a, int b){
        {       
            ::i++;
            for (;;)
            {   
                SomeFunc();
            }   
            cout << "Result: " << a*b<<endl;
        }       
    });    
Run Code Online (Sandbox Code Playgroud)

更新vim 7.4:现在vim不再处理lambda表达式作为错误,但它仍然没有在lambda表达式中做任何缩进,所以它仍然不能用于c ++ :-(

顺便说一句:有没有一个好的自动格式化工具可以添加到vim环境,所以在外部按一个键进行格式化?

vim c++11

16
推荐指数
1
解决办法
4314
查看次数

詹金斯管道警告图

我开始将jenkins中的一些工作迁移到管道执行.

有没有机会在多分支管道作业中看到警告图?在我的旧项目中,我可以使用"配置趋势图"选项配置图形.这些选项将在管道语法工具中崩溃.

有没有选项让图表可见?

我有我的Jenkinsfile:

stage ('Warnings gcc') {
    step([$class: 'WarningsPublisher', canComputeNew: false, canResolveRelativePaths: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'GNU Make + GNU C Compiler (gcc)', pattern: 'error_and_warnings.txt']], unHealthy: ''])
}   

stage ('Warnings clang') {
    step([$class: 'WarningsPublisher', canComputeNew: false, canResolveRelativePaths: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'Clang (LLVM based)', pattern: 'error_and_warnings_clang.txt']], unHealthy: ''])
} 
Run Code Online (Sandbox Code Playgroud)

将生成报告但不显示图表.

更新:现在它仍然无法工作,但也不可能使用剪切生成器作为警告插件.

在snipped生成器中为警告插件输入文件名会导致java null指针异常:

javax.servlet.ServletException: java.lang.NullPointerException …
Run Code Online (Sandbox Code Playgroud)

jenkins jenkins-plugins jenkins-pipeline

12
推荐指数
1
解决办法
5159
查看次数

Variadic模板示例

考虑下面的代码,我不明白为什么必须定义print的空函数.

#include <iostream>
using namespace std;

void print()
{   
}   

    template <typename T, typename... Types>
void print (const T& firstArg, const Types&... args)
{   
    cout << firstArg << endl; // print first argument
    print(args...); // call print() for remaining arguments
}

int main()
{   
    int i=1;
    int  j=2;
    char c = 'T';
    print(i,"hello",j,i,c,"word");

}   
Run Code Online (Sandbox Code Playgroud)

c++ c++11

11
推荐指数
3
解决办法
4943
查看次数

在同一表达式中多个扩展多个参数包

我想问一下以下代码是否有效.

我想知道在一个表达式中多次扩展参数包的可能性.

#include <iostream>
#include <tuple>

class ExpandWithConstructor
{
    public:
        template <typename ... T>
        ExpandWithConstructor( T... args) { }
};

template <typename T>
int PrintArgs( T arg )
{
    std::cout << arg  << ", ";
    return 0;
}

template <typename Head, typename ... T>
class DebugPrinter: public DebugPrinter<T...>
{
    public:
        DebugPrinter() { }

        template< typename ...Y>
        DebugPrinter( Y ... rest ) 
        {   
            std::cout << "Construction of: " << __PRETTY_FUNCTION__ << " Values: " ;
            ExpandWithConstructor{PrintArgs( rest)...};
            std::cout << std::endl;
        } …
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

10
推荐指数
1
解决办法
2881
查看次数

下标迭代器中的lambda

在下标运算符中使用lambda似乎不适用于g ++和clang.

这是c ++标准中的实现错误还是"不快乐"规则?

例:

class A
{   
    public:
        template<typename T> void operator[](T) {}
        template<typename T> void operator()(T) {}
};  

int main()
{   
    A a;
    a[ [](){} ];    // did not compiler: see error message
    a( [](){} );    // works as expected
} 
Run Code Online (Sandbox Code Playgroud)

错误:

main.cpp:13:6: error: two consecutive '[' shall only introduce an attribute before '[' token
     a[ [](){} ];
      ^   
main.cpp:13:15: error: expected primary-expression before ']' token
     a[ [](){} ];
Run Code Online (Sandbox Code Playgroud)

我知道属性以"[["开头,但我想知道"[["(带有一个或多个空格)也像:

 void func( int x [ [gnu::unused] ] ) …
Run Code Online (Sandbox Code Playgroud)

c++ lambda attributes language-lawyer c++11

10
推荐指数
2
解决办法
312
查看次数

为什么sfinae超载没有解决

这个版本工作正常:

template<typename T>
struct Foo
{
    template<typename U = T>
        typename std::enable_if<std::is_same<U,A>::value>::type
        bar() { std::cout << "1" << std::endl; }

    template<typename U = T> 
        typename std::enable_if<std::is_same<U,B>::value>::type
        bar() { std::cout << "2" << std::endl; }
};  
Run Code Online (Sandbox Code Playgroud)

此版本失败:

template<typename T>
struct Foo2
{
    template<typename U = T, typename V = typename std::enable_if<std::is_same<U,A>::value>::type >
        V bar() { std::cout << "1" << std::endl; }

    template<typename U = T, typename V = typename std::enable_if<std::is_same<U,B>::value>::type >
        V bar() { std::cout << "2" << std::endl; }
}; …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading sfinae

10
推荐指数
1
解决办法
136
查看次数

从std :: tuple派生时的混乱,无法处理std :: get

我的基本想法是从std :: tuple派生我自己的类,以获得一些内部帮助器类型:

template <typename ... T>
class TypeContainer: public std::tuple<T...>
{   
    public:
        using BaseType = std::tuple<T...>;
        static const size_t Size = sizeof...(T);
        TypeContainer(T... args):std::tuple<T...>(args...){};

        using index_sequence = std::index_sequence_for<T...>;
};
Run Code Online (Sandbox Code Playgroud)

现在我尝试使用如下代码:

using MyType_tuple_with_empty =         std::tuple<       std::tuple<float,int>,    std::tuple<>,    std::tuple<int>>;
using MyType_typecontainer_with_empty = TypeContainer< TypeContainer<float,int>, TypeContainer<>, TypeContainer<int>>;

using MyType_tuple_non_empty =          std::tuple<       std::tuple<float,int>,    std::tuple<int>,    std::tuple<int>>;
using MyType_typecontainer_non_empty =  TypeContainer< TypeContainer<float,int>, TypeContainer<int>, TypeContainer<int>>;

template <typename T>
void Do( const T& parms )
{
    // The following lines result in errors if TypeContainer with
    // …
Run Code Online (Sandbox Code Playgroud)

c++ tuples libstdc++ c++11 stdtuple

8
推荐指数
1
解决办法
1729
查看次数