我在自己的.h和.cpp文件中定义了一些静态函数,因此可以从其他地方调用这些函数而无需实例化:
functions.h
#pragma once
class functions {
public:
static const int addition(const int&, const int&);
static const int product(const int&, const int&);
};
functions.cpp
#include "functions.h"
const int functions::addition(const int& op1, const int& op2) {
return op1 + op2;
}
const int functions::product(const int& op1, const int& op2) {
return op1 * op2;
}
我还为程序设置创建了一个部分,我将在其中定义要选择的函数:
constants.h
#pragma once
const int modulus = 10;
extern const int(*operation)(const int&, const int&);
constants.cpp
#include "constants.h"
#include "functions.h"
const int(*operation)(const int&, const int&) = &functions::addition;
此代码使用以下示例按预期工作:
的main.cpp
#include <iostream>
#include "constants.h"
int main() {
int a = 7, b = 4;
std::cout << operation(a,b) % modulus << std::endl;
}
问题是,现在我想使用非类型模板参数化函数添加和产品,例如:
functions.h
#pragma once
class functions {
public:
template<const int&> static const int addition(const int&, const int&);
};
functions.cpp
#include "functions.h"
template<const int& sub> const int functions::addition(const int& op1, const int& op2) {
return op1 + op2 - sub;
}
后来的代码中断,无论我如何尝试调整其他文件。我做了我合理(毫无意义)可以想象的一切。
有关如何重写常量代码的任何帮助。*将非常感激。
答案 0 :(得分:0)
模板在编译时被实例化,为此必须知道定义 - 您需要在标题中定义模板。
即使您这样做,也没有int
作为参数,而是const int&
。
这意味着你需要用一个左值来实例化它,它的身份(即位置)可以在编译时确定。
反过来,这意味着参数必须是具有外部链接的变量 - 不是临时变量或局部变量。
换句话说:
extern int x;
void foo()
{
addition<1>(2,3); // Not good; not an lvalue
const int y = 1;
addition<y>(2,3); // Not good; no linkage
addition<x>(2,3); // Good
}
您可能希望改为使用template<int sub>
。
(另一方面注意:对原始类型的const引用毫无意义。他们所做的只是增加开销。)
答案 1 :(得分:0)
模板定义应该在实例化期间对编译器可见,或者显式实例化。由于我非常怀疑您可以显式实例化所有可能的整数模板版本,因此您已将defginitons放入标题中。
问题是operations
。由于它是一个函数指针,它只能指向模板的特定实例 - 用特定整数模板实例化的实例。怀疑它是否可用。
我建议重新考虑你的设计。