小编jaz*_*man的帖子

虚拟继承:错误:没有唯一的最终覆盖

我知道虚拟继承在此之前和之前都有涉及这个问题,我详细介绍了虚拟继承,并详细介绍了类似的问题,如下所示:

多重钻石继承的编译,不虚,但-犯规,与为什么GCC给我一个错误-最终超控器

我的问题略有不同,因为我没有使用纯虚函数并明确使用虚拟继承来拥有一个唯一的'Base'类.层次结构如下:

   Base
    /\
   /  \
 Der1 Der2
   \  /
   Der3
Run Code Online (Sandbox Code Playgroud)

我知道衍生问题上的可怕钻石,这就是我使用虚拟继承的原因.

#include <iostream>
class base
{
public :

    base()
    {
        std::cout<<"base()" << std::endl;
    }
    virtual void fun()
    {
        std::cout<<"base" << std::endl;
    }
};

class der1: virtual public base
{
public :
    void fun()
    {
        std::cout<<"der1" << std::endl;
    }
};

class der2 : virtual public base
{
public :
    void fun()
    {
        std::cout<<"der2" << std::endl;
    }
};

class der3 : public der1,public der2
{
    public :
    /*void …
Run Code Online (Sandbox Code Playgroud)

c++ multiple-inheritance virtual-inheritance

16
推荐指数
2
解决办法
5175
查看次数

为什么memset sockaddr_in为0

是否有任何明确的指南说我们必须将sockaddr_in结构初始化为零,原因是什么?

// IPv4 AF_INET sockets:
struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};
Run Code Online (Sandbox Code Playgroud)

每当我查看真实的代码或示例或书籍时,它总是具有类似于以下的代码结构:

struct sockaddr_in foo;
memset(&foo, 0, sizeof(foo)); 
foo.sin_port = htons(1025);
foo.sin_family = AF_INET;
inet_pton(AF_INET, "10.0.0.1", &foo.sin_addr);
Run Code Online (Sandbox Code Playgroud)

我知道有些消息来源说char sin_zero[8]会员在那里填充,应该设置为零,但为什么要将其余部分归零.特别是在大多数情况下,在接下来的几行声明中对它们进行初始化.即使是sin_zero成员,beej编程指南也表示不再强制将它们归零.我已经搜索了一个解释,但没有提到任何重点.这个堆栈溢出问题对初始化本身有一些不同的建议,但没有解释为什么归零是必要的.

这是遗留的做法还是有一些我错过的真正原因?任何参考表示赞赏.

c++ sockets network-programming memset

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

模板静态库与模板实例化

我正在开发一个静态库,该库有多个类模板和函数模板.我理解为了使用静态库中的模板,所有(声明/定义)都需要在头文件中.但是,在这种特殊情况下,因为我知道我认为可以使用的特化类型转发声明专门化.

这个技巧与类模板(及其函数)很好地协作,我可以使用我的应用程序代码中的所有库函数.然而,当我介绍免费函数模板库中,我尝试使用免费的模板功能从我的应用程序代码,它给了我链接错误:

错误LNK2019:未解析的外部符号"类TemplatedStaticLib __cdecl HelpingRegistration(int)"(?? $ HelpingRegistration @ H @@ YA?AV?$ TemplatedStaticLib @ H @@ H @ Z)在函数_main 1> C:\ src\cpp中引用\ vs2008\StaticLibExample\MathFuncsLib\Debug\TemplatedStaticLibApp.exe:致命错误LNK1120:1未解析的外部"我正在使用VS2008,这里是代码

//静态库头文件(.h)

#ifndef _TEMPLATED_STATIC_LIB_
#define _TEMPLATED_STATIC_LIB_

#include <iostream>

template<typename T>
class TemplatedStaticLib
{
public:
    TemplatedStaticLib(){};
    ~TemplatedStaticLib(){};

    void print(T t);

};

template<typename T>
TemplatedStaticLib<T> HelpingRegistration(T);


#endif
Run Code Online (Sandbox Code Playgroud)

//静态库类文件(.cpp)

#include "TemplatedStaticLib.h"

//Specialization
template class TemplatedStaticLib<double>;
template class TemplatedStaticLib<int>;
template class TemplatedStaticLib<std::string>;


template<typename T>
void TemplatedStaticLib<T>::print(T t)
{
    std::cout << "Templated Print "  << typeid(t).name() << std::endl;
}

void HelpingRegistration(void)
{
}

//Specialization …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

类模板特化中的静态成员函数

我正在努力访问类模板中定义的静态成员函数.在头文件TemplateTest.h中,我将主类模板定义为:

#include<iostream>

template<class T, class U>
struct TemplateTest
{
public:
    void static invoke();
    /*{

        std::cout << "Should not be called" << std::endl;

    }*/
};
Run Code Online (Sandbox Code Playgroud)

然后源文件TemplateTester.cpp我把一个专业化:

#include "TemplateTest.h"

template<>
struct TemplateTest<int, bool>
{
    static void invoke()
    {
        std::cout << "invoke<int, bool>" << std::endl;   
    }
};

template struct TemplateTest<int, bool>; //instantiate to resolve linker issue
Run Code Online (Sandbox Code Playgroud)

我明确地实例化了类,因此链接器正确解析.

在驱动程序driver.cpp中:

include "TemplateTest.h"

int main()
{
    TemplateTest<int, bool>::invoke();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我使用g ++编译TemplateTest.cpp时,它会正确生成目标文件,但是当我尝试将其链接到驱动程序类时,它会给我的链接器错误"未定义引用`TemplateTest :: invoke()"

我经历了像这样的其他相关帖子,但我没有尝试访问功能模板.

任何线索都非常感谢.

c++ static templates instantiation specialization

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

Visual Studio dll导出类和函数模板实例的问题

我在win7中使用VS2008,在CentOS 18中使用g ++ 4.7.只有在我使用动态共享库时才能在Windows上看到这个问题.当我转换它静态库时程序链接正常.

据我所知,在共享库模板函数/类中应该在头文件或模板中定义模板类型(参数)的实例化应该通过编译单元提供.我选择了后一个选项.我以前做过,我经历过

为什么模板只能在头文件中实现?

带有模板的C++共享库:未定义的符号错误

但我无法弄清楚为什么在Windows中将库转换为DLL后无法解析符号:错误LNK2019:未解析的外部符号"void __cdecl HelpingRegistration(double)"(?? $ HelpingRegistration @ N @@ YAXN @ Z)在函数_main中引用

在Windows中,它可以与静态库一起使用.在Linux中,动态和共享库都可以工作.

//Static library
//Library header
#ifndef _TEMPLATED_STATIC_LIB_
#define _TEMPLATED_STATIC_LIB_

#include <iostream>
#include <string>
#include "Export.h"

template<typename T>
class EXPORT TemplatedStaticLib
{
public:
    TemplatedStaticLib(){};
    ~TemplatedStaticLib(){};

    void print(T t);

};

template<typename T>
EXPORT void HelpingRegistration(T);

#endif
Run Code Online (Sandbox Code Playgroud)

//库.cpp

#include "TemplatedStaticLib.h"
#include <typeinfo>


template<typename T>
void TemplatedStaticLib<T>::print(T t)
{
    std::cout << "Templated Print: "<< t<< " type:: "  << typeid(t).name() << std::endl;
}

//Class Template explicit …
Run Code Online (Sandbox Code Playgroud)

c++ templates shared-libraries

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

C++中的嵌套隐式转换

我希望在两个级别进行隐式转换.以下代码片段是我面临的问题的原型.

//Sources
class A
{
public:
    void print()
    {
        std::cout <<"Class A"<< std::endl;
    }

    operator int()
    {
        return 1;
    }
};

class B
{
public:
    void print()
    {
        std::cout <<"Class B"<< std::endl;
    }

    operator A()
    {
        return A();
    }
};

class C
{
public:
    void print()
    {
        std::cout <<"Class C"<< std::endl;
    }
    operator B()
    {
        return B();
    }
};


void print_(A a)
{
    a.print();
}

//driver

int main( int argc, char* argv[] )
{
    C c;

    //print_( c ); // …
Run Code Online (Sandbox Code Playgroud)

c++ conversion-operator implicit-conversion

3
推荐指数
1
解决办法
158
查看次数