相关疑难解决方法(0)

pImpl成语是否真的在实践中使用?

我正在阅读Herb Sutter的"Exceptional C++"一书,在那本书中我学到了关于pImpl的习语.基本上,我们的想法是为a的private对象创建一个结构class并动态分配它们以减少编译时间(并且还以更好的方式隐藏私有实现).

例如:

class X
{
private:
  C c;
  D d;  
} ;
Run Code Online (Sandbox Code Playgroud)

可以改为:

class X
{
private:
  struct XImpl;
  XImpl* pImpl;       
};
Run Code Online (Sandbox Code Playgroud)

并且,在CPP中,定义:

struct X::XImpl
{
  C c;
  D d;
};
Run Code Online (Sandbox Code Playgroud)

这看起来很有趣,但我以前从未见过这种方法,既没有在我工作的公司,也没有在我看过源代码的开源项目中.所以,我想知道这种技术真的在实践中使用了吗?

我应该在任何地方使用它,还是谨慎使用?这种技术是否建议用于嵌入式系统(性能非常重要)?

c++ oop pimpl-idiom

157
推荐指数
7
解决办法
3万
查看次数

连接子做什么?

我一直在想.我知道编译器会将您编写的代码转换为二进制文件,但链接器的作用是什么?对我来说,它们一直是个谜.

我粗略地理解'链接'是什么.当对库和框架的引用添加到二进制文件时.除此之外我什么都不懂.对我来说它"只是有效".我也理解动态链接的基础知识,但没有太深入.

有人可以解释这些条款吗?

c++ linker dynamic-linking

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

使用extern模板(C++ 11)

图1:功能模板

TemplHeader.h

template<typename T>
void f();
Run Code Online (Sandbox Code Playgroud)

TemplCpp.cpp

template<typename T>
void f(){
   //...
}    
//explicit instantation
template void f<T>();
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
    f<char>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的使用方法extern template,还是仅将此关键字用于类模板,如图2所示?

图2:类模板

TemplHeader.h

template<typename T>
class foo {
    T f();
};
Run Code Online (Sandbox Code Playgroud)

TemplCpp.cpp

template<typename T>
void foo<T>::f() {
    //...
}
//explicit instantation
template class foo<int>;
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

#include "TemplHeader.h"
extern template class foo<int>();
int main() {
    foo<int> test;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道将所有这些放在一个头文件中是好的,但如果我们在多个文件中实例化具有相同参数的模板,那么我们会得到多个相同的定义,编译器会将它们全部删除(除了一个)以避免错误.我该怎么用 …

c++ templates extern c++11

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

将模板化的C++类拆分为.hpp/.cpp文件 - 是否可能?

我在尝试编译一个C++模板类时遇到错误,该类在一个.hpp.cpp文件之间分开:

$ g++ -c -o main.o main.cpp  
$ g++ -c -o stack.o stack.cpp   
$ g++ -o main main.o stack.o  
main.o: In function `main':  
main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()'  
main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()'  
collect2: ld returned 1 exit status  
make: *** [program] Error 1  
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

stack.hpp:

#ifndef _STACK_HPP
#define _STACK_HPP

template <typename Type>
class stack {
    public:
            stack();
            ~stack();
};
#endif
Run Code Online (Sandbox Code Playgroud)

stack.cpp:

#include <iostream>
#include "stack.hpp"

template <typename Type> stack<Type>::stack() {
        std::cerr << "Hello, …
Run Code Online (Sandbox Code Playgroud)

c++ linker templates header class

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

"模板<>"vs"模板"没有括号 - 有什么区别?

假设我已经宣布:

template <typename T> void foo(T& t);
Run Code Online (Sandbox Code Playgroud)

现在,有什么区别

template <> void foo<int>(int& t);
Run Code Online (Sandbox Code Playgroud)

template void foo<int>(int& t);
Run Code Online (Sandbox Code Playgroud)

语义?模板与无括号和模板与空括号在其他上下文中有其他语义吗?


相关: 如何强制实例化C++模板的特定实例?

c++ templates template-specialization

72
推荐指数
2
解决办法
6198
查看次数

使用cmake处理头文件依赖项

我在一个小型的C++项目中使用CMake,到目前为止它运行得很好......有一个转折:x

当我更改头文件时,通常需要重新编译许多源文件(直接或间接包含它们的文件),但是cmake似乎只检测了一些要重新编译的源文件,从而导致状态损坏.我可以通过消除项目并从头开始重建来解决这个问题,但这绕过了使用make实用程序的目标:只重新编译所需的内容.

因此,我想我做错了什么.

我的项目非常简单有条理:

  • 所有资源都在的顶级目录,主CMakeLists.txt就在那里
  • 所有公共标题所在的"include"目录(在各个子目录中)
  • 一个"src"目录,其中源文件的所有子目录都是,src CMakeLists.txt就在那里
  • "src"目录中每个子目录的CMakeLists.txt

主目录有:

cmake_minimum_required(VERSION 2.8)

project(FOO)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)

# Compiler Options
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++0x -Wall -Wextra -Werror")

include_directories($(FOO_SOURCE_DIR)/include)

add_subdirectory(src)
Run Code Online (Sandbox Code Playgroud)

"src"目录:

add_subdirectory(sub1)
add_subdirectory(sub2)
add_subdirectory(sub3)
add_subdirectory(sub4)

add_executable(foo main.cpp)

target_link_libraries(foo sub1 sub2 sub3 sub4)
Run Code Online (Sandbox Code Playgroud)

sub4取决于sub3哪个取决于sub2哪个取决于sub1

以及子目录(sub3)的示例:

set(SUB3_SRCS
    File1.cpp
    File2.cpp
    File3.cpp
    File4.cpp
    File5.cpp
    File6.cpp
    )

add_library(sub3 ${SUB3_SRCS})

target_link_libraries(sub3 sub1 sub2)
Run Code Online (Sandbox Code Playgroud)

我很高兴如果有人能把我的错误指向我,在这里搜索或在CMake上没有产生任何东西,所以我想这很容易或应该开箱即用......

(供参考,我在MSYS上使用cmake版本2.8.2)

编辑:

感谢Bill的建议,我已经检查了depend.makeCMake生成的文件,而且确实缺乏(严重).这是一个例子:

src/sub3/CMakeFiles/sub3.dir/File1.cpp.obj: ../src/sub3/File1.cpp
Run Code Online (Sandbox Code Playgroud)

是的,这就是所有,包括的所有内容都被引用:x

c++ dependencies cmake header-files

46
推荐指数
2
解决办法
5万
查看次数

c ++模板中的实例化和专业化之间的区别

C++模板上下文中的特化和实例化有什么区别.从我到目前为止所读到的内容,以下是我对专业化和实例化的理解.

template <typename T>
struct Struct
{

     T x;
};

template<>
struct Struct <int> //specialization
{

    //code
};

int main()
{
   Struct <int> s; //specialized version comes into play
   Struct <float> r; // Struct <float> is instantiated by the compiler as shown below

}
Run Code Online (Sandbox Code Playgroud)

Struct <float>由编译器实例化

template <typename T=float>
struct Struct
{
    float x;
}
Run Code Online (Sandbox Code Playgroud)

我对模板实例化和专业化的理解是否正确?

c++ templates

39
推荐指数
5
解决办法
1万
查看次数

在C/C++中为项目生成makefile的依赖项

我有一个项目,其中包含一个具有破坏依赖项的makefile.是否有任何最着名的方法来生成我可以在makefile中使用的项目的依赖项列表,而不是手动检查每个源文件或手写perl脚本?

c c++ dependencies makefile

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

如何使用C++模板减少编译时间

我正在将我的C++应用程序的一部分从使用旧的C类型数组更改为模板化的C++容器类.有关详情,请参阅此问题.虽然解决方案运行良好,但我对模板化代码所做的每一个小改动都会导致进行大量的重新编译,从而大大减慢构建时间.有没有办法从标题中取出模板代码并返回到cpp文件,这样小的实现更改不会导致重大的重建?

c++ templates compile-time

34
推荐指数
5
解决办法
2万
查看次数

如何在C++模块系统中处理模板?

我正在阅读论文A Module System for C++ 来理解C++模块,这是C++的一个提议特性.

我无法完全理解此模块架构如何导出模板.

有任何想法吗?

c++ c++20 c++-modules

29
推荐指数
1
解决办法
4256
查看次数