小编Mar*_* J.的帖子

未定义的符号"vtable for ..."和"typeinfo for ..."?

几乎是最后一步,但仍然有一些奇怪的错误......

bash-3.2$ make
g++ -Wall -c -g Myworld.cc
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o World.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem
Undefined symbols:
  "vtable for Obstacle", referenced from:
      Obstacle::Obstacle()in Myworld.o
  "typeinfo for Obstacle", referenced from:
      typeinfo for RECTANGLEin RECTANGLE.o
      typeinfo for CIRCLEin CIRCLE.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [solvePlanningProblem] Error 1
Run Code Online (Sandbox Code Playgroud)

vtable和typeinfo的含义是什么?

c++ linker-errors pure-virtual vtable undefined-reference

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

C++ 1y/C++ 14:变量模板专业化?

根据C++ 1y/C++ 14 N3690,变量模板特化的类型是否必须与主模板的类型相同?

template<int x>
char y = f(x);

template<>
double y<42> = g();
Run Code Online (Sandbox Code Playgroud)

如果是这样,是否有可能以某种方式保留主要的未定义?

template<int x>
???? y = ???; // undefined

template<>
double y<42> = g();
Run Code Online (Sandbox Code Playgroud)

草案涵盖哪些内容?

类模板的等效功能是:

template<int x>
struct S
{
    static char y;
};

template<>
struct S<42>
{
    static double y;
};
Run Code Online (Sandbox Code Playgroud)

template<int x>
struct S; // undefined

template<>
struct S<42>
{
    static double y;
};
Run Code Online (Sandbox Code Playgroud)

c++ templates c++14

33
推荐指数
2
解决办法
5396
查看次数

未捕获的IndexSizeError:无法在'Selection'上执行'getRangeAt':0不是有效的索引

这有什么问题?

if ( window.getSelection() ) 
  EditField = window.getSelection().getRangeAt(0);
Run Code Online (Sandbox Code Playgroud)

抛出错误:

未捕获的IndexSizeError:无法在"选择"上执行"getRangeAt":0不是有效索引.

javascript

22
推荐指数
1
解决办法
2万
查看次数

C/C++链接约定

当调用C++算法(如copy_if,transform等,它们将一元或二元函数作为最后一个参数)时,我可以传递一个像atoi或tolower这样的C库函数.

例如,以下调用工作正常并给出正确的输出(在ideone中尝试)

1) transform (foo, foo+5, bar, atoi);
2) transform (foo, foo+5, bar, ptr_fun(atoi));
3) transform(s.begin(),s.end(),s.begin(), static_cast<int (*)(int)>(tolower));
Run Code Online (Sandbox Code Playgroud)

这种用法是否可以保证适用于所有C++编译器?

用C++思考的这本书提到"这适用于一些编译器,但并不是必须的." 提到的原因是(据我所知),转换是C++函数,并期望它的最后一个参数具有相同的调用约定.

本书还提出了解决此问题的方法,即在单独的cpp文件中创建这样的包装函数,并且不包含iostreams头文件.

// tolower_wrapper.cpp
string strTolower(string s) {
  transform(s.begin(), s.end(), s.begin(), tolower);
  return s;
} 
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我不明白这是如何解决调用约定问题的?transform仍然是一个c ++函数,而tolower仍然是strTolower中的一个C函数,所以这里处理这些不同的调用约定.

c c++ declspec

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

Xcode - 将二进制文件与调试和发布库链接起来

我在Xcode 5中有一个使用各种boost库的项目.我已经构建了boost的调试版和发行版,并将二进制文件放在同一个位置.

我想以这样的方式构建我的调试和发布应用程序,当我构建一个调试版本时,它链接到调试增强库,当我构建一个发行版本时,它链接到发布增强库.

在Xcode中,在Build Phases下,我没有看到如何在'Link binary With Libraries'中指定一组二进制文件用于调试,另一组用于发布.

我该怎么做呢?

c++ xcode linker boost

7
推荐指数
1
解决办法
3769
查看次数

为什么没有返回int的round()类型函数?

C标准库N1256定义了一堆舍入函数.基本上有两个"完整"的家庭,

  • RINT:

    double rint(double x);
    float rintf(float x);
    long double rintl(long double x);
    // The rint functions round their argument to an integer value
    //  in floating-point format, using the current rounding direction
    
    long int lrint(double x);
    long int lrintf(float x);
    long int lrintl(long double x);
    long long int llrint(double x);
    long long int llrintf(float x);
    long long int llrintl(long double x);
    // The lrint and llrint functions round their argument 
    //  to the nearest integer value, rounding …
    Run Code Online (Sandbox Code Playgroud)

c c99 rounding

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

专门研究功能模板

如何在c ++中专门化函数模板?

#include <iostream>

template <int X = 0>  //Wrong attempt, does not compile.
int func(int y)
{
    return X + y;
}

template<int X>
int func(int y)
{
    return X + func<X-1>(y);
}


int main()
{
    std::cout << func<1>(2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望这个程序的结果是:1 + 0 + y = 3.

对于y = 2,它将是:2 + 1 + 0 + y.

我知道有更好的方法来进行这种计算,我试图理解这种语言的这个方面.

c++ templates template-specialization

0
推荐指数
1
解决办法
122
查看次数