Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何避免到处链接某个对象文件_C++_Templates_Linker_Constants_Header Files - Fatal编程技术网

C++ 如何避免到处链接某个对象文件

C++ 如何避免到处链接某个对象文件,c++,templates,linker,constants,header-files,C++,Templates,Linker,Constants,Header Files,所以我得到了一个类,它为每种类型指定了一个具有特殊含义的常量。 我用这样的东西 template<class Type> class SpecialKeyProvider { static const Type SPECIAL_KEY; } 模板 类SpecialKeyProvider { 静态常数型特殊_键; } 对也将使用但不是数字的类型进行一个或多个专门化。 因此,我在类的定义之外初始化静态成员,就像我必须: // This seems to have to be in

所以我得到了一个类,它为每种类型指定了一个具有特殊含义的常量。 我用这样的东西

template<class Type>
class SpecialKeyProvider
{
  static const Type SPECIAL_KEY;
}
模板
类SpecialKeyProvider
{
静态常数型特殊_键;
}
对也将使用但不是数字的类型进行一个或多个专门化。 因此,我在类的定义之外初始化静态成员,就像我必须:

// This seems to have to be in a cpp as having it in the same header, 
// will result in duplicate definitions of SPECIAL_KEY;

// This particular instantiation is kind of problematic anyways, see
// the end of my question for another question on this one.
template<>
string SpecialKeyProvider<string>::SPECIAL_KEY = "__SPECIAL";

template <class Type>
Type SpecialKeyProvider<Type> = std::numeric_limits<Type>::max();
//这似乎必须在cpp中,因为它在同一个头中,
//将导致特殊_键的定义重复;
//这个特定的实例化无论如何都有点问题,请参见
//我的问题的结尾是关于这个问题的另一个问题。
模板
字符串SpecialKeyProvider::SPECIAL_KEY=“_SPECIAL”;
模板
键入SpecialKeyProvider=std::numeric_limits::max();
不幸的是,SpecialKeyProvider在一个非常中心的容器类中使用。这个容器有很多方法,出于性能原因,这些方法应该内联,并且在许多地方使用。所以我把整个容器放在头文件中。但是现在使用了SpecialKeyProvider,我仍然必须将SpecialKeyProvider.o链接到我项目中几乎每个二进制文件

有没有办法摆脱这种情况,并在标头中进行模板专门化,而不会因为“多个定义”而出现错误

关于字符串常量的第二个问题

// I know this is bad code but I don't know how to do it better.
template<>
string SpecialKeyProvider<string>::SPECIAL_KEY = "__SPECIAL";
//我知道这是个糟糕的代码,但我不知道如何做得更好。
模板
字符串SpecialKeyProvider::SPECIAL_KEY=“_SPECIAL”;
我知道(linter提醒我),使用任何类类型的常量通常都是一个坏主意,因为构造()的顺序不确定,特别是字符串。虽然我通常可以使用const char[],但我不知道在这种情况下该怎么办,因为我希望为字符串实例化模板。将模板(即使用使用SpecialKeyProvider的容器类)与char*一起使用会非常痛苦


非常感谢您的建议。

静态常量
放在头文件的未命名命名空间中

namespace
{
  template<class Type>
  class SpecialKeyProvider
  {
    static const Type SPECIAL_KEY;
  };
  template<>
  const string SpecialKeyProvider<string>::SPECIAL_KEY = "__SPECIAL";  //<--- const

  template<>
  const double SpecialKeyProvider<double>::SPECIAL_KEY = 3.3;  //<--- const
}
名称空间
{
模板
类SpecialKeyProvider
{
静态常数型特殊_键;
};
模板

const string SpecialKeyProvider::SPECIAL_KEY=“\uu SPECIAL”/首先,需要编译SpecialKeyProvider.cpp并将其链接到每个项目中并没有问题。您正在创建一个不存在问题的问题。您的makefile或IDE应该能够处理此问题

更好的是,静态(或动态)库没有问题,其中一个成员是SpecialKeyProvider.o,它需要链接到每个项目中。同样,您的makefile或IDE应该能够处理库

关于谷歌风格指南,这不是最好的。它是一种更好地称为C±而不是C++的样式指南。它们禁止使用非const引用,因为有时人们可能会混淆。这里禁止使用静态类型的类,因为有时会导致静态初始化顺序失败。

禁止批量出售,因为在某些情况下,人们可能滥用C++的东西是一种不好的做法。


确切地说,您定义的那些
SpecialKeyProvider::SPECIAL_KEY
中的相互依赖关系在哪里,甚至使静态初始化顺序失败?

那么在每个编译单元中它将是不同的类型。这是个好主意吗?不,它不会是不同的类型。它将只是一个不同的
const
值copy。例如,每个文件都将具有具有相同值的
常量字符串特殊\u键
“\u特殊”
。但是
SpecialKeyProvider
将来自不同的名称空间。如果与其他模板一起使用,可能会导致ODR问题。@iammilind不知何故,这对我不起作用。使用KeyProvider的容器位于其自己的名称空间中。链接时,我收到表单错误“未定义的引用::SpecialKeyProvider::SPECIAL_KEY”@iammilind非常感谢。我的错误是由一个混乱的生成文件引起的。现在效果很好!非常有帮助!