我知道虚拟继承在此之前和之前都有涉及这个问题,我详细介绍了虚拟继承,并详细介绍了类似的问题,如下所示:
多重钻石继承的编译,不虚,但-犯规,与 和 为什么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) 是否有任何明确的指南说我们必须将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编程指南也表示不再强制将它们归零.我已经搜索了一个解释,但没有提到任何重点.这个堆栈溢出问题对初始化本身有一些不同的建议,但没有解释为什么归零是必要的.
这是遗留的做法还是有一些我错过的真正原因?任何参考表示赞赏.
我正在开发一个静态库,该库有多个类模板和函数模板.我理解为了使用静态库中的模板,所有(声明/定义)都需要在头文件中.但是,在这种特殊情况下,因为我知道我认为可以使用的特化类型转发声明专门化.
这个技巧与类模板(及其函数)很好地协作,我可以使用我的应用程序代码中的所有库函数.然而,当我介绍免费函数模板库中,我尝试使用免费的模板功能从我的应用程序代码,它给了我链接错误:
错误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) 我正在努力访问类模板中定义的静态成员函数.在头文件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()"
我经历了像这样的其他相关帖子,但我没有尝试访问功能模板.
任何线索都非常感谢.
我在win7中使用VS2008,在CentOS 18中使用g ++ 4.7.只有在我使用动态共享库时才能在Windows上看到这个问题.当我转换它静态库时程序链接正常.
据我所知,在共享库模板函数/类中应该在头文件或模板中定义模板类型(参数)的实例化应该通过编译单元提供.我选择了后一个选项.我以前做过,我经历过
但我无法弄清楚为什么在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) 我希望在两个级别进行隐式转换.以下代码片段是我面临的问题的原型.
//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)