0

我正在尝试将字符串作为 C++ 模板参数传递,但我似乎无法让它工作。作为记录,我正在使用 SystemC 库(因此所有 sc_xxx 的东西)。根据这个答案,我正在做的事情应该有效,但我看不出我做错了什么。编译器告诉我“filePath不能出现在常量”表达式中。”任何帮助将不胜感激。

主文件

int sc_main(int argc, char* argv[])
{
  const char filePath[] = "test.txt";
  Interconnect<sc_uint<32>, filePath, 10> myInterconnect;


  return 0;
}

互连.h

template<class T, const char filePath[], unsigned nPortPairs = 10>
SC_MODULE(Interconnect)
{
public:
 ...
};
4

3 回答 3

2

filePath是一个本地自动变量,因此它的地址是一个运行时特性。模板需要在编译时知道的地址。在 C++03 中还有一个关于链接的问题;我不完全确定,但我认为链接问题已在 C++11 中修复。

一个简单的解决方法是让文件路径成为普通的构造函数参数。

于 2014-10-02T02:47:59.917 回答
0

我发现您正在做的事情与您提供链接的答案之间存在两个差异。

  1. 您的字符串常量是一个局部变量。在另一个答案中,它是一个全局变量。
  2. 您的模板参数是一个 const char 数组。在另一个答案中,它是一个 const char *。

我的猜测是你只需要消除这些差异。

我发现另一个资源似乎证实了我的猜测。

于 2014-10-02T03:03:31.440 回答
0

如果你有boost,这可以用下面的宏来简化:

#define C_STR(str_) boost::mpl::c_str< BOOST_METAPARSE_STRING(str_) >::value

然后使用如下:

template<const char* str>
struct testit{
};
testit<C_STR("hello")> ti;
于 2019-01-17T10:21:46.273 回答