如何在C++函数模板中指定默认非模板参数初始化器?

如何在C++函数模板中指定默认非模板参数初始化器?,c++,templates,eclipse-juno,C++,Templates,Eclipse Juno,编辑:有关详细信息,请参见我自己对该问题的回答。原来是Eclipse Juno错误,不是C++问题。然而,这个问题仍然为其他C++模板用户提供了一个有用的话题。 如果我希望创建一个模板类,其中包含一个模板类型的参数和其他非temlate类型的参数,我可以吗?我如何指定 示例:一个实现或itoa,但具有多个类型、填充和返回字符串 编辑:固定定义中的变量名称 template <typename T> std::string Num2Str( T x, char pad

编辑:有关详细信息,请参见我自己对该问题的回答。原来是Eclipse Juno错误,不是C++问题。然而,这个问题仍然为其他C++模板用户提供了一个有用的话题。 如果我希望创建一个模板类,其中包含一个模板类型的参数和其他非temlate类型的参数,我可以吗?我如何指定

示例:一个实现或itoa,但具有多个类型、填充和返回字符串

编辑:固定定义中的变量名称

   template <typename T>   std::string    Num2Str( T x, char pad = ' ', int width = 0 );
   template <typename T>   std::string    Num2Str( T x, char pad, int width )
   {
      static std::string   string;
      std::stringstream    ss;
      ss << std::setfill(pad) << std::setw(width) << x;
      string = ss.str();
      return string;
   }

编辑:这应该适用于编译器/平台、g++、VC++。

我认为您混淆了模板参数和函数参数。为什么不仅仅是这样:

#include <sstream>
#include <iomanip>

template <typename T>   
std::string Num2Str( T x, char pad = ' ', int width = 0 )
{
    static std::string   string;
    std::stringstream    ss;
    ss << std::setfill(pad) << std::setw(width) << x;
    string = ss.str();
    return string;
}

void Test()
{
    auto s1 = Num2Str( 1.0 );
    auto s2 = Num2Str( 2, '-' );
    auto s3 = Num2Str( 3.0, ' ', 3 );
}

嗯,我找到了窃听器。绝对没有什么语法或C++。这是EclipseJuno中的一个bug。索引器似乎跟不上构建。重建索引消除了这两个错误。projectexpoller->projname->Index->Rebuild。您可能首先需要执行一个项目expoller->projname->Index->刷新所有文件。最后,在问题窗格中,按ctrl-A键选择所有错误,然后按del和ENTER键清除错误日志

这个索引器bug的一个有趣的工件是IDE并不总是忘记在当前构建之前它知道的错误。它似乎无法忘记前面提到的两个错误并报告它们,即使它们不在那里

我将编辑OP,将Ecipse Juno添加为一个标签,希望它能帮助该群中的某个人


谢谢你的帮助

我不明白这个问题。上面的代码看起来非常有效。你有什么问题?问题是g++不接受初始值设定项。我尝试了Num2Str 10,但没有找到合适的函数。如果我使用Num2Str 10',0,它就可以正常工作。g++c++99确保默认值在头文件的模板声明中?!这直接取自我的common.h文件。定义与声明一致。我一定读过他们必须在大约100个地方在一起。无法使用带模板的.h和.cpp。请尝试。使用“无效参数”失败的候选项为:std::basic_string Num2Str0,char,int语义错误`和使用“无效参数”的候选项为:std::basic_string&appendconst std::basic_string&appendconst std::basic_string&appendconst std::basic_string&unsigned int,unsigned int…还有大约250个字符的语义Error@WesMiller上面的代码应该可以工作。请发布一个可编译的例子来重现这个错误。好吧,它自己修复了。我知道我修改了main.cpp中include的顺序,但是我不知道为什么顺序很重要;我过早地说出了自己的看法。请看我的答案以获得解释。哇,太随机了。我在VisualStudio中也看到过类似的行为,但并不是灾难性的,后台Intellisense编译器不同步并指示不存在的编译错误。一段时间后,您开发了一个嗅探测试。