C++ 是否可以强制新的模板实例化?

C++ 是否可以强制新的模板实例化?,c++,templates,C++,Templates,我希望有如下(psuedo-C++)类。其基本思想是,任何新值都将初始化为最后一个设定值 StickyData.hpp template<typename T> class StickyData { static T s_lastValue; T m_value; StickyData() { m_value = s_lastValue; } // Initialize to last set value T& operator = (T& rhs)

我希望有如下(psuedo-C++)类。其基本思想是,任何新值都将初始化为最后一个设定值

StickyData.hpp

template<typename T>
class StickyData {
  static T s_lastValue;
  T m_value;
  StickyData() { m_value = s_lastValue; } // Initialize to last set value
  T& operator = (T& rhs)  { 
       m_value = s_lastValue = rhs;
  }
}

template<> StickyData<T>::s_lastValue;
模板
类粘性数据{
静态T s_值;
T m_值;
StickyData(){m_value=s_lastValue;}//初始化为最后一个设置值
T&运算符=(T&rhs){
m_值=s_lastValue=rhs;
}
}
模板StickyData::s_lastValue;
UseData.cpp

typedef int Ford;
typedef int GM;
typedef int Toyota;

StickyData<Ford> aFord;
StickyData<GM> aGM;
StickyData<Toyota> aToyota;

aFord = 10;
aGM = 2
aToyota = 20;

StickyData<Ford> anotherFord; // I want this automatically initialized to 10
typedef int-Ford;
typedef int-GM;
丰田公司;
粘性数据;
粘性数据年度股东大会;
粘性数据原子;
aFord=10;
年度股东大会=2
aToyota=20;
StickyData anotherFord;//我想让它自动初始化为10
为了让它工作,我需要对这些typedef中的每一个进行唯一的粘性数据编译。实际上,我认为这将按原样工作,但当我运行这段代码时,似乎我只为所有这些不同的模板实例化创建了1个静态int


我可以为相同的基础值类型强制编译新模板吗?

在您的示例代码中,福特、GMs和丰田都是相同的类型。您应该将它们声明为实际的单独类型:

struct Toyota {};
struct Ford   {};
struct GM     {};
目前,您的代码等同于:

HoldData<int> aFord;
HoldData<int> aGM;
HoldData<int> aToyota;

回应注释:“……但是编译器确实知道区别,例如,如果您有typedef'ed参数,您可以将某个显式标记为不接受类型“int”作为参数……”

我有以下代码:

typedef int foo;

class C {
    explicit C(int x);
    explicit C(foo x);
};
此代码无法编译,出现以下错误:

blah.cc:5:11: error: ‘C::C(foo)’ cannot be overloaded
  explicit C(foo x);
           ^
blah.cc:4:11: error: with ‘C::C(int)’
  explicit C(int x);
           ^

<代码> int <代码>是代码> int <代码>是代码> Ford < /Corp>是代码> GM< /COD> <代码>丰田< /代码>。<代码> TyPulf< /Cort>在C++中创建类型别名,而不是新类型。@ JROK DAMIMIT-我从一个基本示例切换到了稍微复杂的实际情况,以防万一有人对如何实现这一点有更好的想法。但是我没有完成代码的编辑。。。我已经为子孙后代更新了这个问题。是的,代码与之相当,但并不完全相同(也就是说,如果我说#define Ford int,我会得到这个结果——但是编译器确实知道其中的区别,例如,如果你有一个typedef'ed参数,你可以标记一些显式的东西,然后不接受类型“int”作为参数我已经包括了一个我相信你刚才建议的反例,并且为了我自己的完整性,我已经包括了一个完全可构建的例子来说明我的想法。
typedef int foo;

class C {
    explicit C(int x);
    explicit C(foo x);
};
blah.cc:5:11: error: ‘C::C(foo)’ cannot be overloaded
  explicit C(foo x);
           ^
blah.cc:4:11: error: with ‘C::C(int)’
  explicit C(int x);
           ^