我正在阅读Herb Sutter的"Exceptional C++"一书,在那本书中我学到了关于pImpl的习语.基本上,我们的想法是为a的private对象创建一个结构class并动态分配它们以减少编译时间(并且还以更好的方式隐藏私有实现).
例如:
class X
{
private:
  C c;
  D d;  
} ;
可以改为:
class X
{
private:
  struct XImpl;
  XImpl* pImpl;       
};
并且,在CPP中,定义:
struct X::XImpl
{
  C c;
  D d;
};
这看起来很有趣,但我以前从未见过这种方法,既没有在我工作的公司,也没有在我看过源代码的开源项目中.所以,我想知道这种技术真的在实践中使用了吗?
我应该在任何地方使用它,还是谨慎使用?这种技术是否建议用于嵌入式系统(性能非常重要)?
我一直在想.我知道编译器会将您编写的代码转换为二进制文件,但链接器的作用是什么?对我来说,它们一直是个谜.
我粗略地理解'链接'是什么.当对库和框架的引用添加到二进制文件时.除此之外我什么都不懂.对我来说它"只是有效".我也理解动态链接的基础知识,但没有太深入.
有人可以解释这些条款吗?
TemplHeader.h
template<typename T>
void f();
TemplCpp.cpp
template<typename T>
void f(){
   //...
}    
//explicit instantation
template void f<T>();
Main.cpp的
#include "TemplHeader.h"
extern template void f<T>(); //is this correct?
int main() {
    f<char>();
    return 0;
}
这是正确的使用方法extern template,还是仅将此关键字用于类模板,如图2所示?
TemplHeader.h
template<typename T>
class foo {
    T f();
};
TemplCpp.cpp
template<typename T>
void foo<T>::f() {
    //...
}
//explicit instantation
template class foo<int>;
Main.cpp的
#include "TemplHeader.h"
extern template class foo<int>();
int main() {
    foo<int> test;
    return 0;
}
我知道将所有这些放在一个头文件中是好的,但如果我们在多个文件中实例化具有相同参数的模板,那么我们会得到多个相同的定义,编译器会将它们全部删除(除了一个)以避免错误.我该怎么用 …
我在尝试编译一个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  
这是我的代码:
stack.hpp:
#ifndef _STACK_HPP
#define _STACK_HPP
template <typename Type>
class stack {
    public:
            stack();
            ~stack();
};
#endif
stack.cpp:
#include <iostream>
#include "stack.hpp"
template <typename Type> stack<Type>::stack() {
        std::cerr << "Hello, …假设我已经宣布:
template <typename T> void foo(T& t);
现在,有什么区别
template <> void foo<int>(int& t);
和
template void foo<int>(int& t);
语义?模板与无括号和模板与空括号在其他上下文中有其他语义吗?
我在一个小型的C++项目中使用CMake,到目前为止它运行得很好......有一个转折:x
当我更改头文件时,通常需要重新编译许多源文件(直接或间接包含它们的文件),但是cmake似乎只检测了一些要重新编译的源文件,从而导致状态损坏.我可以通过消除项目并从头开始重建来解决这个问题,但这绕过了使用make实用程序的目标:只重新编译所需的内容.
因此,我想我做错了什么.
我的项目非常简单有条理:
主目录有:
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)
"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)
哪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)
我很高兴如果有人能把我的错误指向我,在这里搜索或在CMake上没有产生任何东西,所以我想这很容易或应该开箱即用......
(供参考,我在MSYS上使用cmake版本2.8.2)
编辑:
感谢Bill的建议,我已经检查了depend.makeCMake生成的文件,而且确实缺乏(严重).这是一个例子:
src/sub3/CMakeFiles/sub3.dir/File1.cpp.obj: ../src/sub3/File1.cpp
是的,这就是所有,包括的所有内容都被引用:x
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
}
Struct <float>由编译器实例化
template <typename T=float>
struct Struct
{
    float x;
}
我对模板实例化和专业化的理解是否正确?
我有一个项目,其中包含一个具有破坏依赖项的makefile.是否有任何最着名的方法来生成我可以在makefile中使用的项目的依赖项列表,而不是手动检查每个源文件或手写perl脚本?
我正在将我的C++应用程序的一部分从使用旧的C类型数组更改为模板化的C++容器类.有关详情,请参阅此问题.虽然解决方案运行良好,但我对模板化代码所做的每一个小改动都会导致进行大量的重新编译,从而大大减慢构建时间.有没有办法从标题中取出模板代码并返回到cpp文件,这样小的实现更改不会导致重大的重建?
c++ ×10
templates ×5
dependencies ×2
linker ×2
c ×1
c++-modules ×1
c++11 ×1
c++20 ×1
class ×1
cmake ×1
compile-time ×1
extern ×1
header ×1
header-files ×1
makefile ×1
oop ×1
pimpl-idiom ×1