C++ 工作函数指针模板出现Netbeans错误

C++ 工作函数指针模板出现Netbeans错误,c++,netbeans,C++,Netbeans,我有一组函数,这些函数不带参数,返回一个整数,我想在C++03中缓存它们的结果 刷新函数指针语法后,我写: #include <iostream> int return_one() { std::cout << "Calling one\n"; return 1; } int return_two() { std::cout << "Calling two\n"; return 2; } template <int(*f

我有一组函数,这些函数不带参数,返回一个整数,我想在C++03中缓存它们的结果

刷新函数指针语法后,我写:

#include <iostream>

int return_one() {
    std::cout << "Calling one\n";
    return 1;
}
int return_two() {
    std::cout << "Calling two\n";
    return 2;
}
template <int(*f)()>       // line 11
int cached() {
    static int x = f();    // line 13
    return x;
}

int main() {
    std::cout << cached<return_one>() << '\n';
    std::cout << cached<return_two>() << '\n';
    std::cout << cached<return_one>() << '\n';
    std::cout << cached<return_two>() << '\n';
    std::cout << cached<return_one>() << '\n';
    std::cout << cached<return_two>() << '\n';
}
我觉得一切都很好

然而,Netbeans在第11行和第13行的
f
下划下划线,抱怨“无法解析标识符f”是一个错误。我可以点击“运行项目(F6)”按钮,程序可以愉快地编译和运行

为什么Netbeans抱怨我的模板参数



对于奖励积分,我使用的函数集没有参数,但有些返回
int
,有些返回
bool
。我只是想复制粘贴我的模板,每个函数返回类型一个。是否有一个模板可用于处理这两种返回类型?

您可以插入
typedef
以去除红线:

typedef int(*f);

template <int(*f)()>       // line 11
int cached() {
    static int x = f();    // line 13
    return x;
}
typedef int(*f);

template <int(*f)()>       // line 11
int cached() {
    static int x = f();    // line 13
    return x;
}
typedef int(*f); // Keeps warning away - again

template <class T, T(*f)()>       // line 11
T cached() {
    static T x = f();    // line 13
    return x;
}
bool return_bool()
{
    std::cout << "Calling bool\n";
    return true;
}

float return_float()
{
    std::cout << "Calling float\n";
    return 0.31f;
}

std::string return_string()
{
    std::cout << "Calling std::string\n";
    return "abc";
}

// ...

std::cout << cached<int, return_one>() << '\n';
std::cout << cached<int, return_two>() << '\n';
std::cout << cached<int, return_one>() << '\n';
std::cout << cached<int, return_two>() << '\n';
std::cout << cached<int, return_one>() << '\n';
std::cout << cached<int, return_two>() << '\n';

std::cout << cached<bool, return_bool>() << '\n';
std::cout << cached<bool, return_bool>() << '\n';
std::cout << cached<float, return_float>() << '\n';
std::cout << cached<float, return_float>() << '\n';
std::cout << cached<std::string, return_string>() << '\n';
std::cout << cached<std::string, return_string>() << '\n';
Calling one
1
Calling two
2
1
2
1
2
Calling bool
1
1
Calling float
0.31
0.31
Calling std::string
abc
abc